상속
1.클래스 간의 관계와 상속
- 객체 지향 프로그램에서도 부모 클래스의 필드와 메서드를 자식 클래스에게 물려줄 수 있다.
- 상속을 사용하면 적은 양의 코드로 새로운 클래스를 작성할 수도 있고 공통적인 코드를 관리하여 코드의 추가와
변경이 쉬워질 수도 있다
- 이러한 특성 때문에 상속을 사용하면 코드의 중복이 제거되고 재사용성이 크게 증가하여 생산성과 유지 보수성에
매우 유리하다.
- 상속
- 클래스 간의 상속은 extends 키워드를 사용하여 정의할 수 있다.
ex) public class 자식 클래스 extends 부모클래스 { }
- 클래스 간의 상속은 extends 키워드를 사용하여 정의할 수 있다.
- 부모 클래스에 새로운 필드와 메서드가 추가되면 자식 클래스는 이를 상속받아 사용할 수 있다.
- 자식 클래스에 새로운 필드와 메서드가 추가되어도 부모 클래스는 어떠한 영향도 받지 않는다
- 따라서 자식 클래스의 멤버 개수는 부모 클래스보다 항상 같거나
많았다
- 클래스 간의 관계
- 상속 관계 : is -a ("~은 ~(이)다.")
- 포함 관계 : has ~ a ("~은 ~ 을(를) 가지고 있다.")
- 단일 상속과 다중 상속
- Java는 다중 상속을 허용하지 않는다.
- 다중 상속을 허용하면 클래스 간의 관계가 복잡해지는 문제가 생기기 때문.
- Object
- Object는 말 그대로 "객체"를 의미하는 단어이며 보통, Object 클래스를 의미합니다.
- Object 클래스는 Java 내 모든 클래스들의 최상위 부모 클래스이다.
- 모든 클래스는 Object의 메서드를 사용할 수 있다.
- 또한 부모가 없는 자식 클래스는 컴파일러에 의해 자동으로 Object 클래스를 상속받게 된다.
Object 클래스 메서드 몇가지!
- Object clone() : 해당 객체의 복제본을 생성하여 반환
- boolean equals(Object object) : 해당 객체와 전달받은 객체가 같은지 여부를 반환
- Class getClass() : 해당 객체의 클래스 타입을 반환.
- int hashCode() : 자바에서 객체를 식별하는 정수값인 해시 코드를 반환함
- String toString() : 해당 객체의 정보를 문자여로 반환함 & Object 클래스에서는 클래스 이름 @해쉬코드 값 리턴
2. 오버라이딩
부모 클래스로부터 상속받은 메서드의 내영을 재정의 하는 것을 오버라이딩이라고 한다.
- 부모 클래스의 메서드를 그대로 사용 가능하지만 자식 클래스의 상황에 맞게 변경을 해야 하는 경우 오버라이딩을 사용
- 오버라이딩을 하기 위해서는 조건을 만족해야 한다.
1. 선언부가 부모 클래스의 메서드와 일치해야 한다.
2. 접근 제어자를 부모 클래스의 메서드 보다 좁은 범위로 변경할 수 없다.
3. 예외는 부모 클래스의 메서드 보다 많이 선언할 수 없다.
- super 와 super()
- super는 부모 클래스의 멤버를 참조할 수 있는 키워드
- 객체 내부 생성자 및 메서드에서 부모 클래스의 멤버에 접근하기 위해 사용될 수 있다.
- 자식 클래스 내부에서 선언한 멤버와 부모 클래스에서 상속받은 멤버와 이름이 같을 경우
이를 구분하기 위해 사용된다.
- super()는 부모 클래스의 생성자를 호출할 수 있는 키워드
- 객체 내부 생성자 및 메서드에서 해당 객체의 부모 클래스의 생성자를 호출하기 위해 사용 될 수 있다.
- 자식 클래스의 객체가 생성될 때 부모 클래스들이 모두 합쳐져서 하나의 인스턴스가 생성된다.
- 이때 부모 클래스의 멤버들이 초기화 작업이 먼저 수행이 되어야 한다.
- 따라서 자식 클래스의 생성자에서는 부모 클래스의 생성자가 호출된다
- 또한 부모 클래스의 생성자는 가장 첫 줄에서 호출이 되어야 한다
- super는 부모 클래스의 멤버를 참조할 수 있는 키워드
3. 다형성
- 참조 변수의 타입 변환
- 자동 타입 변환
- 부모 타입 변수 = 자식 타입 객체; 는 자동으로 부토 타입으로 변환이 일어난다.
- 자식 객체는 부모 객체의 멤버를 상속받기 때문에 부모와 동일하게 취급될 수 있다.
- 다만 주의할 점은 부모 타입 변수로 자식 객체의 멤버에 접근할 때는 부모 클래스에 선언된 즉,
상속받은 멤버만 접근 가능
- 다만 주의할 점은 부모 타입 변수로 자식 객체의 멤버에 접근할 때는 부모 클래스에 선언된 즉,
- 강제 타입 변환
- 자식 타입 변수 = (자식 타입) 부모 타입 객체;
- 부모 타입 객체는 자식 타입 변수로 자동으로 타입 변환되지 않습니다.
- 이럴 때는 타입 변환 연산자를 사용하여 강제로 자식 타입으로 변환할 수 있다.
- 다만 무조건 강제 타입으로 변환을 할 수 있는 것은 아니다.
- 자식 타입 객체가 부모 타입으로 자동 타입 변환된 후 다시 자식 타입으로 변환될 때만
강제 타입 변환이 가능하다. - 부모 타입 변수로는 자식 타입 객체의 고유한 멤버를 사용할 수 없기 때문에 사용이 필요한
경우가 생겼을 때 강제 타입 변환을 사용한다.
- 자식 타입 객체가 부모 타입으로 자동 타입 변환된 후 다시 자식 타입으로 변환될 때만
- 이렇게 자동 타입 변환된 부모 타입 변수가 아닌 부모 객체를 자식 타입의 변수로
강제 타입 변환하려고 하면 오류가 발생한다.
- 다만 무조건 강제 타입으로 변환을 할 수 있는 것은 아니다.
- 자식 타입 변수 = (자식 타입) 부모 타입 객체;
- 다형성이란?
- 여러가지 형태를 가질 수 있는 능력을 의미한다
- 참조 변수 타입 변환을 활용해서 다형성을 구현할 수 있다.
- 여러가지 형태를 가질 수 있는 능력을 의미한다
- instanceof
- 다형성 기능으로 인해 해당 클래스 객체의 원래 클래스명을 체크하는 것이 필요한데 이때 사용할 수 있는 명령어가 instance of 이다.
- 이 명령어를 통해서 해당 객체가 내가 의도하는 클래스의 객체인지 확인할 수 있다.
- {대상 객체} instance of {클래스 이름} 과 같은 형태로 사용하면 응답값은 boolean이다.
- 다형성 기능으로 인해 해당 클래스 객체의 원래 클래스명을 체크하는 것이 필요한데 이때 사용할 수 있는 명령어가 instance of 이다.
- 자동 타입 변환
4. 추상 클래스
- 추상 클래스란?
- 클래스가 설계도라면 추상 클래스는 미완성된 설계도이다.
- abstarct 키워드를 사용하여 추상 클래스를 선언할 수 있다
ex) public abstract class 추상 클래스명 { }
- abstarct 키워드를 사용하여 추상 클래스를 선언할 수 있다
- 추상 클래스는 추상 메서드를 포함할 수 있다.
- 추상 메서드가 없어도 추상 클래스로 선언할 수 있다.
- 추상 클래스는 자식 클래스에 상속되어 자식 클래스에 의해서만 완성될 수 있다.
- 추상 클래스는 여러 개의 자식 클래스들에서 공통적인 필드나 메서드를 추출해서 만들 수 있다.
- 클래스가 설계도라면 추상 클래스는 미완성된 설계도이다.
- 추상 메서드
- 추상 메서드는 아직 구현되지 않은 미완성 메서드이다.
- abstarct 키워드를 사용하여 추상 메서드를 선언할 수 있다.
ex ) public abstract class 추상 클래스명 {
abstract 리턴타입 메서드이름(매개 변수, .....); } - 추상 메서드는 일반적인 메서드와는 다르게 블록{} 이 없다.
- 즉 정의만 할 뿐, 실행 내용은 가지고 있지 않는다.
- abstarct 키워드를 사용하여 추상 메서드를 선언할 수 있다.
- 추상 메서드는 아직 구현되지 않은 미완성 메서드이다.
- 추상 클래스 상속
- 추상 메서드는 extends 키워드를 사용하여 클래스에서 상속된다.
ex ) public class 클래스명 extends 추상 클래스명 {
@override
public 리턴 타입 메서드이름(매개변수, ....) {
}
} - 상속받은 클래스에서 추상 클래스의 추상 메서드는 반드시 오버라이딩 되어야 한다.
- 추상 메서드는 extends 키워드를 사용하여 클래스에서 상속된다.
인터페이스
1. 인터페이스의 역할
- 인터페이스는 두 객체를 연결해 주는 다리 역할을 해준다.
- 상속 관계가 없는 다른 클래스들이 서로 동일한 행위 즉, 메서드를 구현해야 할 때 인터페이스는
구현 클래스들의 동일한 사용 방법과 행윌르 보장해 줄 수 있다.- 인터페이스는 스팩이 정의된 메서드들의 집합이다.
- 인터페이스의 구현 클래스들은 반드시 정의된 메서드들을 구현해야 한다.
- 구현 클래스들의 동일한 사용 방법과 행위를 보장해 줄 수 있다.
- 이러한 특징은 인터페이스에 다형성을 적용할 수있게 만들어 준다.
- 인터페이스의 선언
- interface 키워드를 사용하여 인터페이스를 선언할 수 있다.
ex) public interface 인터페이스명 {} - 인터페이스는 클래스와 마찬가지로 public, default 접근 제어자를 지정할 수 있다.
- interface 키워드를 사용하여 인터페이스를 선언할 수 있다.
- 인터페이스의 구성
- 인터페이스의 멤버
- 모든 멤버 변수는 public static final 이어야 한다.
- 생략 가능
- 모든 메서드는 public abstract 이어야 한다.
- 생략 가능 (static 메서드와 default 메서드 예외)
- 생략되는 제어자는 컴파일러가 자동으로 추가해준다.
- 모든 멤버 변수는 public static final 이어야 한다.
- 인터페이스의 멤버
- 인터페이스의 구현
- 인터페이스는 추상 클래스와 마찬가지로 직접 인스턴스를 생성할 수 없기 때문에 구현되어 생성된다.
- impolements 키워드를 사용하여 인터페이스를 구현할 수 있다.
- 인터페이스의 추상 메서드는 구현될 때 반드시 오버라이딩 되어야 한다.
- 만약 인터페이스의 추상 메서드 일부만 구현해야 한다면 해당 클래스를 추상 클래스로 변경하면 된다.
- 인터페이스는 추상 클래스와 마찬가지로 직접 인스턴스를 생성할 수 없기 때문에 구현되어 생성된다.
- 인터페이스 상속
- 인터페이스 간의 상속이 가능하다.
- 인터페이스 간의 상속은 implements가 아니라 extends 키워드를 사용한다.
- 인터페이스는 클래스와는 다르게 다중 상속이 가능하다.
- 인터페이스 간의 상속이 가능하다.
2. 디폴트 메서드와 static 메서드
- 디폴트 메서드
- 디폴트 메서드는 추상 메서드의 기본적인 구현을 제공하는 메서드이다.
- 메서드 앞에 defualt 키워드를 붙이며 블럭{} 이 존재해야 한다.
- default 메서드 역시 접근 제어자가 public 이며 생략이 간으하다
- 추상 메서드가 아니기 때문에 인터페이스의 구현체들에서 필수로 재정의 할 필요는 없다.
- 디폴트 메서드는 추상 메서드의 기본적인 구현을 제공하는 메서드이다.
- static 메서드
- 인터페이스에서 static 메서드 선언이 간으하다
- static의 특성 그대로 인터페이스의 static 메서드 또한 객체 없이 호출이 가능하다.
- 선언하는 방법과 호출하는 방법은 클래스이 static 메서드와 동일하다
- 접근 제어자를 생략하면 컴파일러가 public을 추가해 준다.
- 인터페이스에서 static 메서드 선언이 간으하다
3. 다형성
- 타입 변환
- 자동 타입 변환
- 인터페이스 변수 = 구현객체; 는 자동으로 타입 변환이 일어난다.
- 강제 타입 변환
- 구현 객체 타입 변수 = (구현 객체 타입) 인터페이스 변수;
- 자동 타입 변환
브랜치 활용하기
브랜치 만드는 명령어
- git branch 브랜치이름
- git branch 브랜치 확인 명령어
브랜치 이동 명령어
- git switch 브랜치 이름
- git checkout 브랜치 이름
브랜치 한번에 생성 & 이동
- git switch -c 브랜치 이름
- git checkout -b 브랜치이름
브랜치 합치는 명령어
- git switch 최종 브랜치 이름
- git merge 합칠 브랜치
pull request 활용하기
pull request 란? pull 당겨서 합치는것 (merge) request 요청하다
메인에 합치는것을 요청하다.
github에 올리기
- git push origin 브랜치이름
'코딩' 카테고리의 다른 글
[TIL] Java 2024.08.01 [프로그래머스/Java] (0) | 2024.08.01 |
---|---|
[TIL] Java 2024.07.31 (0) | 2024.07.31 |
[TIL] 내일배움캠프 웹개발 백엔드 과정 2024.07.29 김현수 (0) | 2024.07.29 |
[TIL] 내일배움캠프 웹개발 백엔드 과정 2024.07.26 김현수 (0) | 2024.07.26 |
[TIL] 내일배움캠프 웹개발 백엔드 과정 2024.07.25 김현수 (0) | 2024.07.25 |