누구나 아는 이야기는 글만 길어질 것 같아 생략하고 중요한 키워드나 내가 모르는 것을 정리해보고자 한다.
클래스
오버로딩
오버로딩은 하나의 메서드가 하나의 기능만을 하지 않고 다양한 기능을 가지는 것이다.
한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메서드가 있더라도, 매개변수의 개수 또는 타입, 순서가 다르면 동일한 이름을 사용해서 메서드를 정의할 수 있다.
조건
- 메서드의 이름이 같고, 매개변수의 개수, 타입, 순서가 달라야 한다.
- '응답 값만' 다른 것은 오버로딩을 할 수 없다.
- 접근 제어자만 다른 것도 오버로딩을 할 수 없다.
- 결론, 오버로딩은 매개변수의 차이로만 구현할 수 있다.
장점
- 메서드 이름 하나로 상황에 따른 동작을 개별로 정의할 수 있다.
- 메서드의 이름을 절약할 수 있다.
인스턴스 멤버와 클래스 멤버
필드와 메서드는 선언하는 방법에 따라서 인스턴스 멤버와 클래스 멤버로 구분할 수 있다.
인스턴스 멤버는 객체 생성 후에 사용할 수 있고 클래스 멤버는 객체 생성 없이도 사용할 수 있다.
클래스 멤버 선언
필드와 메서드를 클래스 멤버로 만들기 위해서는 static 키워드를 사용하면 된다.
일반적으로 인스턴스마다 모두 가지고 있을 필요없는 공용적인 데이터를 저장하는 필드는 클래스 멤버로 선언하는 것이 좋다.
여기서 주의할 점이 있다.
- 클래스 멤버로 선언된 메서드는 인스턴스 멤버를 사용할 수 없다.
- 반대로 인스턴스 멤버로 선언된 메서드는 클래스 멤버를 사용할 수 있다.
- 클래스 멤버는 객체 생성없이 바로 사용 가능하기 때문에 객체가 생성되어야 존재할 수 있는 인스턴스 멤버를 사용할 수 없다.
final 선언
필드 타입 앞에 final 키워드를 추가하여 final 필드를 선언할 수 있다.
이를 이용해 `static final` 키워드를 사용하여 상수를 선언할 수 있다. 모든 인스턴스가 공유할 수 있는 값이 한개이며 불변이다.
일반적으로 상수는 대문자로 사용한다.
생성자
생성자는 객체가 생성될 때 호출되어 객체를 초기화한다.
`new` 연산자를 통해 객체가 생성되면서 생성자가 호출된다.
this와 this()
`this`는 객체 즉, 인스턴스 자기 자신을 가리킨다.
`this()`는 객체 즉, 인스턴스 자기 자신의 생성자를 가리킨다.
접근 제어자
- 클래스, 멤버변수, 메서드, 생성자에 사용되고, 지정되어 있지 않다면 default 입니다.
- `public` : 접근 제한이 전혀 없습니다.
- `protected` : 같은 패키지 내에서, 다른 패키지의 자손클래스에서 접근이 가능합니다
- `default` : 같은 패키지 내에서만 접근이 가능합니다.
- `private` : 같은 클래스 내에서만 접근이 가능합니다.
Getter와 Setter
객체의 무결성 즉, 변경이 없는 상태를 유지하기 위해 `private`와 같은 접근 제어자를 사용한다.
이때, 우리는 어떻게 객체의 private 필드를 읽어오거나 저장할 수 있을까?
Getter로 데이터를 읽고, Setter로 데이터를 저장/수정한다.
상속
상속은 부모가 자식에게 물려주는 것을 말한다.
이를 객체지향으로 말하자면 부모 클래스가 자식 클래스에게 필드나 메서드를 물려줄 수 있다는 것이다.
상속을 사용하면 적은 양의 코드로 새로운 클래스를 작성할 수도 있고 공통적인 코드를 관리하여 코드의 추가와 변경이 쉬워질 수도 있다.
이러한 특성 때문에 상속을 사용하면 코드의 중복이 제거되고 재사용성이 크게 증가하여 생산성과 유지보수성에 매우 유리해진다.
상속은 `extends` 키워드를 사용한다.
단일상속과 다중상속
Java는 다중상속을 허용하지 않는다. 다중상속을 허용하면 클래스간의 관계가 복잡해지는 문제가 생기기 때문이다.
부모클래스는 여러 자식클래스를 가질 수 있지만 자식클래스는 여러 부모클래스를 가질 수 없다.
쉽게 말해 부모는 여러 자식이 있을 수 있지만 자식은 부모가 여러 명 있지 않다.
final 클래스와 메서드
final 키워드를 클래스와 메서드에 사용하면 상속할 수 없고, 오버라이딩할 수 없다.
오버라이딩
부모 클래스로부터 상속받은 메서드의 내용을 재정의 하는 것을 오버라이딩이라고 한다.
- 선언부가 부모 클래스의 메서드와 일치해야 합니다.
- 접근 제어자를 부모 클래스의 메서드 보다 좁은 범위로 변경할 수 없습니다.
- 예외는 부모 클래스의 메서드 보다 많이 선언할 수 없습니다.
추상클래스
클래스가 설계도라면 추상 클래스는 미완성된 설계도이다.
abstract 키워드를 사용하여 추상 클래스를 선언한다.
추상 클래스는 자식 클래스에 상속되어 자식 클래스에 의해서만 완성될 수 있다.
인터페이스
인터페이스는 두 객체를 연결해주는 다리 역할을 해준다.
- 사람과 삼성티비, 엘지티비 객체가 존재한다.
- 사람 객체는 멀티 리모컨 인터페이스를 통해서 삼성티비 객체의 채널을 변경할 수 있다.
- 이때 삼성티비가 아니라 엘지티비로 객체가 교체된다고 해도 채널을 변경할 수 있다.
인터페이스는 interface 키워드를 사용하여 선언할 수 있다.
- 모든 멤버변수는 public static final 이어야 한다. (생략 가능)
- 모든 메서드는 public abstract 이어야 한다. (생략 가능 static 메서드와 default 메서드 예외)
- 생략되는 제어자는 컴파일러가 자동으로 추가 해준다.
인터페이스는 추상클래스와 같이 직접 인스턴스를 생성하지 못하기 때문에 클래스에 implements 키워드를 통해서 구현해야 한다.
인터페이스 간의 상속도 가능하다.
'기타 > 개발일기' 카테고리의 다른 글
[TIL] Gradle, Tomcat, 테스트 코드, Lombok, Spring MVC, 정적 및 동적 페이지 (0) | 2024.01.17 |
---|---|
[TIL] 모던 자바(Java 8) (0) | 2024.01.05 |
[TIL] 프로세스와 쓰레드 (1) | 2024.01.04 |
[TIL] 예외처리, 제네릭 (0) | 2024.01.03 |
[TIL] JVM과 기본 문법 (1) | 2023.12.29 |