Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[1주차] 심규창 학습 PR 제출합니다. #1

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 0 additions & 30 deletions week01/1주차.md

This file was deleted.

94 changes: 94 additions & 0 deletions week01/심규창.md
Original file line number Diff line number Diff line change
@@ -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를 활용해 구현할 수 있다.