diff --git "a/week01/1\354\243\274\354\260\250.md" "b/week01/1\354\243\274\354\260\250.md" deleted file mode 100644 index 95ebbae..0000000 --- "a/week01/1\354\243\274\354\260\250.md" +++ /dev/null @@ -1,30 +0,0 @@ -## COW SPRING 2기 PRE-ONBOARDING 학습 과제 - -### 자바의 필수 개념들을 차근차근 살펴보자. - -* 자바의 primitive Type과 Reference Type은 어떤 차이가 있나요? - - -* 자바의 접근 제어자에 대해 설명해주세요. - - -* static 키워드에 대해 설명해주세요. - - -* final 키워드에 대해 설명해주세요. - * ++ 상속 관련된 내용도 포함할 것! - -* 오버로딩(Overloading)과 오버라이딩(Overriding)에 대해 설명해주세요. - - -* 추상 클래스와 인터페이스는 각각 무엇이고, 어떤 차이를 가지는지 설명해주세요 - * 반드시 추상 클래스와 인터페이스의 사용 목적을 명시해주세요. - - -* Java Enum에 대해 설명해주세요. - - -* 객체지향이란 무엇일까요? 객체지향을 지키면 어떤 이점을 얻을 수 있나요? - - -* 자바 객체지향의 4대 특성에 대해 각각 설명해주세요. \ No newline at end of file diff --git "a/week01/\354\213\254\352\267\234\354\260\275.md" "b/week01/\354\213\254\352\267\234\354\260\275.md" new file mode 100644 index 0000000..f1563fd --- /dev/null +++ "b/week01/\354\213\254\352\267\234\354\260\275.md" @@ -0,0 +1,94 @@ +## COW SPRING 2기 PRE-ONBOARDING 학습 과제 + +### 자바의 필수 개념들을 차근차근 살펴보자. + +* 자바의 primitive Type과 Reference Type은 어떤 차이가 있나요? +> 자바의 데이터 타입은 primitive type(기본 타입)과 reference type(참조형 타입)으로 구분된다. +기본 타입은 논리형(boolean),정수형(byte, short, int, long), 실수형(float, doublid), 문자형(char)로 구성되고 +실제의 값을 저장하는 공간이어서 stack 메모리 영역에 저장된다. 그리고 정해진 크기에 벗어나는 데이터의 값이라면 +컴파일 상에서 에러가 발생한다. 기본 타입은 Null 값을 담을 수 없지만 접근 속도가 빠르고 메모리의 양을 적게 사용한다는 장점이 있다. +> 참조형 타입은 기본형을 제외한 모든 타입이다. 참조형 타입은 객체의 주소를 저장하는 타입으로 메모리 주소 값을 통해 +객체를 참조한다. 이때 참조 타입은 heap 메모리 영역에 저장된다. 참조형 타입은 문자열, 배열, 클래스, 인터페이스가 있다. +참조형 타입은 Null을 담을 수 있지만 기본 타입보다 접근 속도가 느리고 사용하는 메모리의 양이 많은 단점이 있다. + +* 자바의 접근 제어자에 대해 설명해주세요. +> 제어자는 클래스와 클래스 안의 구성 요소의 선언을 할 때 사용해 부가적으로 +의미(정보 은닉 : 객체 지향에서 사용자가 굳이 알 필요 없는 정보를 숨기려는 개념)를 부여하는 키워드이다. +접근 제어자는 이러한 정보 은닉을 위한 기능을 제공하는 역할이다. 자바의 접근 제어자는 private, public, default, protected +4가지가 있으며 동시에 2개 이상 사용할 수 없는 특징이 있다. +> 1) private는 선언된 클래스 요소를 외부에 공개하지 않는 특징을 가진다. 이는 같은 패키지 내에 존재하는 다른 클래스에도 해당된다. + 따라서 private는 해당 요소를 선언한 클래스에서만 접근 할 수 있다. +> 2) public은 선언된 클래스 멤버를 외부에 공개하는 특징을 가진다. 이는 같은 패키지, 그리고 다른 패키지의 클래스 모두가 접근 가능하다. + 그렇기에 외부에서 접근 할 수 없는 private 멤버와 프로그램 사이에서 인터페이스의 역할을 한다. +> 3) default는 클래스, 클래스의 멤버의 접근 제어자의 기본 값이다. 접근 제어자를 따로 명시해주지 않으면 기본적으로 default 접근 제어를 가지게 된다. + default는 같은 패키지 내의 클래스에서만 접근 가능하다. +> 4) protected는 부모 클래스는 public과 같이 동작하지만 그 외에는 private과 같이 동작한다. protected는 해당 멤버를 선언한 +클래스의 멤버, 같은 패키지의 멤버, 해당 멤버를 선언한 클래스를 상속받은 자식 클래스의 멤버가 접근 가능하다. + +* static 키워드에 대해 설명해주세요. +> 고정이라는 의미로 변수, 메소드를 만들 수 있다. 이 둘은 각각 정적 필드, 정적 메소드로 부르며 클래스에 고정된다. +static 키워드를 통해 생성한 정적 필드나 메소드는 프로그램을 실행할 때 static 메모리에 고정적으로 할당 되어 프로그램이 종료될 때 까지 +지속된다. 그렇기에 모든 객체가 공유 가능하고 객체 생성(new) 없이 사용이 가능하다. + +* final 키워드에 대해 설명해주세요. + * ++ 상속 관련된 내용도 포함할 것! +> 자바의 final 키워드는 변수, 메서드, 클래스에 사용이 가능하다. 3가지 경우 모두 제한한다는 공통적인 의미를 가짐과 동시에 각각 다른 의미를 가진다. +> 1) 변수 앞에 붙은 final 키워드는 변수를 수정할 수 없다는 의미를 가진다. 이후 수정이 불가능하기 때문에 처음 초기화 값이 필수적이다. +변수의 값을 변경할 수 없기 때문에 다른 객체를 참조하거나 참조하는 객체 안의 값은 변경이 가능하다. +> 2) 메서드 앞에 붙은 final 키워드는 override를 제한한다. 이는 상속 받은 클래스에서 메서드를 수정해서 사용하지 못하게 제한하는 +의미를 가진다. 부모 클래스에서 생성한 메서드를 자식 클래스가 동일하게 쓰이게 할 때 사용한다. +> 3) 클래스 앞에 붙은 final 키워드는 상속을 할 수 없는 클래스의 의미를 가진다. + +* 오버로딩(Overloading)과 오버라이딩(Overriding)에 대해 설명해주세요. +> 메서드 오버로딩은 같은 이름의 메서드를 중복해 정의하는 것이다. 같은 이름의 메서드를 중복해 작성하는 것은 자바에서 불가능하지만 +같은 이름에 다른 파라미터를 가진 경우 다른 메서드라 인식한다. 이를 통해 메서드에 사용되는 이름을 절약할 수 있고 +객체 지향 프로그래밍의 특징인 다형성을 구현할 수 있다. +> 메서드 오버라이딩은 부모 클래스에서 생성한 메서드를 자식 클래스에서 동일하게 상속 받아 재정의하는 것이다. +이렇게 상속 받은 메서드는 그대로 사용하거나 필요에 따라 로직을 변형해 사용이 가능하다. +> 오버로딩은 새로운 메서드의 정의, 오버라이딩은 기존의 메서드를 사용 및 재정의하는 것이다. + +* 추상 클래스와 인터페이스는 각각 무엇이고, 어떤 차이를 가지는지 설명해주세요 + * 반드시 추상 클래스와 인터페이스의 사용 목적을 명시해주세요. +> 추상 클래스는 하나 이상의 추상 메서드를 포함하는 클래스이다. 여기서 추상 메서드는 자식 클래스에서 반드시 overriding을 통해 +사용하는 메서드를 의미한다. 추상 클래스를 사용함으로써 객체 지향의 이점인 다형성을 가지는 메서드를 정의할 수 있다. +부모 클래스에서 추상 메서드(동작이 정의되지 않은)를 생성하고 자식 클래스에서 overriding을 통해 내부 동작을 채워준다. +추상 클래스를 사용해 공통된 필드나 메서드를 통일할 수 있고 자식 클래스에서 overriding으로 생성한 메서드의 내부 동작만 구현하면 되기 +때문에 코딩하는 데 시간이 절약된다. +> 인터페이스는 추상 클래스처럼 다른 클래스를 만드는 데 도움이 된다. 인터페이스는 다른 클래스를 만들 때 "이러한 구조로 만들어라" 라고 +지정해주는 클래스이다. 그리고 다른 클래스 사이의 중간에서 상호작용하는 역할을 담당한다. 그리고 추상 클래스와 다른 점은 +인터페이스의 내부 static final, 상수 값이나 abstract 메서드 만이 존재할 수 있다. +> 추상 클래스와 인터페이스는 다른 클래스를 만드는 데 도움을 준다는 장점이 있지만 각각이 사용되는 방식에는 차이가 있다. +추상 클래스는 다중 상속을 할 수 없는 대신 추상 메서드나 일반 메서드를 내부 구현 없이 생성할 수 있다. 또한 일반 변수나 상수 모두 +마찬가지이다. 하지만 인터페이스는 다중 상속이 가능하고 추상 메서드와 상수 만으로 구성된다는 차이점이 있다. + +* Java Enum에 대해 설명해주세요. +> enum은 enumeration type으로 열거체라는 의미를 가진다. 자바 기준 JDK 1.5부터 enum 클래스를 사용할 수 있게 되었다. +enum을 사용하면 IDE의 지원(자동 완성, 오타 검증 등)을 더 원활하게 받을 수 있고 유지 보수에 도움이 된다. 그리고 enum type은 +컴파일 시 오류를 줄일 수 있고 값이 추가 되도 한 곳에서만 변경하면 되기 때문에 관리가 편하다는 장점이 있다. +이를 사용할 때는 이름.이름1의 형태로 사용 가능하다. enum은 처음 값을 0으로 설정하고 1만큼 증가하는 형태이다. +이를 ordinal(정의된 순서 반환), valuesOf(전달된 값과 일치하는 enum의 상수를 반환) 메서드를 통해 확인 가능하고 +values 메서드를 통해 enum의 모든 값을 저장한 배열을 생성 후 반환할 수 있다. + +* 객체지향이란 무엇일까요? 객체지향을 지키면 어떤 이점을 얻을 수 있나요? +> 객체란 현실에 있는 모든 대상을 의미한다. 객체 지향 프로그래밍은 현실의 대상을 목표로 컴퓨터 프로그램을 만드는 과정을 의미한다. +이 과정에서 프로그래밍에서 필요한 데이터는 추상화를 통해 상태(state)와 행위(behavior)를 가진 객체로 만들고 이러한 객체들의 상호작용을 +통해 프로그램을 설계, 개발하는 것을 의미한다. 또한 코드 내에서 객체는 변수와 메소드를 묶은 것이다. 객체들은 재사용이 가능하고 +유지보수에 도움이 된다. +> 장점 : 코드 재사용에 용이 / 생산성 향상(상속, 객체 재사용, 부분 수정 등) / 유지보수 용이 +> 단점 : 실행 속도 느림(절차지향 언어 - 컴퓨터 처리 구조와 비슷) / 설계에 많은 시간 소요 + +* 자바 객체지향의 4대 특성에 대해 각각 설명해주세요. +> 1) 추상화 : 대상들에 공통된 특징을 뽑아내는 것을 의미한다. 이러한 특징을 뽑아 공통 클래스를 만들고 새로 추가되는 객체들 개인이 가진 +특징을 추가하는 것이 가능하다. 클래스가 추가될 때마다 코드를 새로 짜는 것이 아니고 정해진 역할에 따라 각각의 클래스를 구현하기 때문에 +더 간편하고 유지보수에도 도움이 된다. (예를 들어 고양이, 강아지는 동물이라는 공통된 특징이 존재한다. 동물이라는 공통 클래스(추상 클래스)를 +만들고 고양이, 강아지라는 클래스는 만들어진 동물 클래스를 상속 받아 각자의 특징을 추가로 작성할 수 있다.) +> 2) 다형성 : 하나의 객체가 다양한 타입을 가질 수 있는 것을 의미한다. 기능의 확장, 객체의 타입 변화 등에 용이하게 사용된다. +다형성을 사용하는 방법은 overroading, overriding, 함수형 인터페이스가 있다. overroading은 같은 이름의 메서드를 다른 파라미터 값을 +통해 구분하는 방식, overriding은 부모 클래스에서 생성한 클래스를 상속 받아 그대로 사용하거나 변형시켜 사용하는 방식, 함수형 +인터페이스는 한 개의 추상 메소드를 가진 인터페이스로 람다식 표현이 가능한 방식이다. +> 3) 상속 : 기존의 클래스에 기능을 추가 하는 등 새로운 클래스를 정의하는 것이다. 상속을 통해 기존에 있던 클래스의 모든 필드, +메서드를 받아올 수 있는데 이를 통해 생성된 클래스를 자식 클래스, 기존에 있던 클래스를 부모 클래스라 정의한다. 상속을 사용할 경우 +기존에 있던 클래스를 재활용하는 것이기에 중복되는 코드를 줄일 수 있고 생산성을 높인다. +> 4) 캡슐화 : 서로 연관이 있는 속성이나 기능을 하나의 캡슐로 만들어 외부로부터 보호(데이터 보호)하는 것이다. 그리고 내부의 동작을 +감추고 외부에 필요한 부분만을 노출(데이터 은닉)한다. 이는 외부로부터 오염을 방지하고 각 객체의 독립성과 영역을 안전하게 지킨다. +이러한 캡슐화는 접근 제어자(public, private, protected, default), getter와 setter를 활용해 구현할 수 있다. \ No newline at end of file