Jun's Development Journey

[Java/문법] 클래스 본문

JAVA/문법

[Java/문법] 클래스

J_Jayce 2022. 1. 3. 17:47

1. 다른 생성자 호출

- 생성자 오버로딩이 많아질 경우 생성자 간의 중복된 코드가 발생할 수 있다.

- 이 경우엔 필드 초기화 내용은 한 생성자에만 집중적으로 작성하고, 나머지 생성자는 초기화 내용을 가지고 있는 생성자를 호출하는 방식으로 개선할 수 있다.

 

ex)

 

2. 정적 멤버와 static

- 클래스에 고정된 멤버로서, 객체를 생성하지 않고 사용할 수 있는 필드와 메소드이다.

- 필드 및 메소드 선언 시 static 키워드를 추가적으로 붙여주면 된다. 

- 정적 필드 및 메소드는 클래스에 고정된 멤버이기에 클래스별로 관리된다.

- 인스턴스 필드, 정적필드 중 어느 것으로 선언할 것인가는 객체마다 가지고 있어야 하는 멤버는 인스턴스, 공용적인 데이터면 정적 필드로 선언하는 것이 좋다.

- 예를 들어 원의 넓이나 둘레를 구할 때 파이(3.14xxxx)는 객체마다 가질 필요가 없고 변하지 않는 값이기에 정적 필드가 좋다.

- 메소드 경우 인스턴스 필드를 이용해서 실행한다면 인스턴스 메소드, 그렇지 않다면 정적 메소르로 선언한다.

- 예를 들어 Calculator 클래스의 덧셈, 뺄셈 기능은 인스턴스 필드 보단 매개변수로 받는 값들을 사용하기에 정적 메소드가 바람직하다.

 

2-1) 정적 멤버 사용

- 클래스이름.필드;

- 클래스이름.메소드(매개변수....)

 

2-2) 싱글톤

- 전체 프로그램에서 단 하나의 객체만 만들도록 보장해야 하는 경우가 있다. 

- 어플리케이션이 시작될 때 어떤 클래스가 최초 한번만 메모리 할당하고(static), 그 메모리에 인스턴스를

만들어 사용하는 디자인 패턴이다.

 

2-2-1) 싱글톤 장점

- 한번의 new로 인스턴스 사용하기에 메모리 절약

- 싱글톤 클래스의 인스턴스는 전역이기에 다른 클래스의 인스턴스들이 데이터를 공유하기 쉽다.

- 두 번째 이용 시 객체 로딩 시간을 줄일 수 있다.

 

2-2-2) 싱글톤 단점

- 싱글톤 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유시킬 경우 다른 클래스의 인스턴스들 간의 

결합도가 높아져 "개방-폐쇄 원칙"을 위배하게 된다.

- 이는 객체지향설계 원칙에 어긋나기에 수정이 어렵고 유지보수 비용이 높아질 수 있다.

 

2-2-3) 예시

 

 

3. 어노테이션

- 컴파일 과정과 실행 과정에서 코드를 어떻게 컴파일하고 처리할 것인지를 알려주는 정보이다.

- 어노테이션 형태 : @AnnotationName

- 3가지 용도

1) 컴파일러에게 코드 문법 에러를 체크하도록 정보를 제공

ex) @Override : 정확히 오버라이딩 됐는지 체크하도록 컴파일러에게 알려준다.

2) SW 개발 툴이 빌드나 배치 시 코드를 자동으로 생성할 수 있도록 정보를 제공

3) 런타임 시 특정 기능을 실행하도록 정보를 제공

 

3-1) 타입 정의와 적용

 

4. 접근 제한자

접근 제한 적용 대상 접근 가능 클래스
public  클래스, 필드, 생성자, 메소드 모든 내,외 클래스
protected 필드, 생성자, 메소드 자식 클래스, 같은 패키지에 속한 클래스
default 클래스, 필드, 생성자, 메소드 같은 패키지에 속한 클래스
private  필드, 생성자, 메소드 없음

 

 

 

5. 상속

5-1) 부모 생성자 호출

- 자식 객체를 생성하면, 부모 객체가 먼저 생성되고, 자식 객체가 그 다음에 생성된다.

- super(매개값,. ....) 생성자는 매개값의 타입과 일치하는 부모 생성자를 호출한다. 만약 매개값의 타입과 일치하는 부모 생성자가 없을 경우 컴파일 오류가 난다.

- super(매개값,. ....)가 생략되면 컴파일러는 super()를 자동적으로 추가하기 때문에 부모의 기본 생성자가 존재해야 한다. 부모 클래스에 기본 생성자가 없고, 매개 변수가 있는 생성자만 있다면 자식 생성자에서 반드시 부모 생성자 호출을 위해 super(매개값,. ....)를 명시적으로 호출해야 한다.

- super(매개값,. ....)는 반드시 자식 생성자 첫 줄에 위치해야 한다.

 

 

5-2) 메소드 오버라이딩

- 상속된 메소드의 내용이 자식 클래스에 맞지 않을 경우, 자식 클래스에서 동일한 메소드를 재정의하는 것이다.

- 메소드가 오버라이딩되었다면, 부모 객체의 메소드는 숨겨지고 오버라이딩된 자식 메소드가 호출된다.

- 주의할 점 3가지

 -> 부모의 메소드와 동일한 시그니처(리턴 타입, 메소드 이름, 매개 변수 리스트)를 가져야한다.

 -> 접근 제한을 더 강하게 오버라이딩할 수 없다.

 -> 새로운 예외를 throws할 수 없다.

 

 

5-3) 부모 메소드 호출

- 자식 클래스 내부에서 오버라이딩된 부모 클래스의 메소드를 호출해야 하는 상황이 발생한다면, 명시적으로 super 키워드를 붙여 부모 메소드를 호출할 수 있다.

- super는 부모 객체를 참조하고 있기 때문에 부모 메소드에 직접 접근 가능하다.

-ex

 

5-4) 자동 타입 변환

- 자동 타입 변환의 개념은 자식은 부모의 특징과 기능을 상속받기 때문에 부모와 동일하게 취급될 수 있다는 것이다.

- ex

Cat cat = new Cat();

Animal animal = cat;

(Animal animal = new Cat(); 로 표현 가능)

=> cat과 animal 변수는 타입만 다를 뿐, 동일한 Cat 객체를 참조한다.

 

5-4-1) 자동 타입 변환 후 멤버 접근

- Child 객체는 method3()를 가지고 있지만, Parent 타입으로 변한된 이후에는 접근이 불가하다.

- method2()는 부모와 자식에게 모두 있다. 즉 오버라이딩된 메소드는 타입 변환 이후에도 자식 메소드가 호출된다.

 

 

 

5-5) 추상 클래스

5-5-1) 사용 이유

1) 실체 클래스들의 공통된 필드와 메소드의 이름을 통일할 목적

- 실체 클래스를 설계하는 사람이 여러 사람일 경우, 실체 클래스마다 필드와 메소드가 제각기 다른 이름을 가질 수 있다.

 

2) 실체 클래스를 작성할 때 시간을 절약

- 공통적인 필드와 메소드는 추상 클래스에 모두 선언해두고, 실체 클래스마다 다른 점만 실체 클래스에 선언하게 되면 실체 클래스를 작성하는데 시간을 절약할 수 있다.

 

 

5-5-2) 추상 메소드와 오버라이딩

- 모든 실체들이 가지고 있는 메소드의 실행 내용이 동일하다면 추상 클래스에 메소드를 작성하는 것이 좋지만, 메소드 선언만 통일화하고, 실행 내용은 실체 클래스마다 달라야 하는 경우가 있다.

- 추상 메소드는 추상 클래스에서만 선언할 수 있는데, 메소드의 선언부만 있고, 메소드 실행 내용인 중괄호 {}가 없는 메소드이다.

- 자식 클래스는 반드시 추상 메소드를 재정의해야한다.

-ex

'JAVA > 문법' 카테고리의 다른 글

[Java/문법] 스레드-1  (0) 2022.01.04
[Java/문법] 입출력(I/O)  (0) 2022.01.04
[Java/문법] Main 메소드  (0) 2022.01.03
[Java/문법] 연산자  (0) 2022.01.03
[Java/문법] 강제 타입 변환 주의점  (0) 2022.01.03