● 상속(Inheritance)이란?
-기존 클래스를 재사용하여 새로운 클래스를 작성하는 것이다.
-코드의 재사용성을 높이고 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 크게 기여한다.
-생성자는 상속되지 않고 단지 자식에 의해서 자동으로 호출
-하위 클래스는 상위 클래스의 모든 권한을 갖는다.
-상속 형식
class 자손클래스 extends 조상클래스{
멤버 변수와 멤버 메서드 선언과 정의
}
● 상속관계
-기존의 클래스를 재사용해서 새로운 클래스를 작성하는 것
-자손은 조상의 모든 멤버를 상속받는다.(생성자, 초기화 블록 제외)
-공통부분은 조상에서 관리하고 개별 부분은 자손에서 관리한다.
-조상의 변경은 자손에 영향을 미치지만, 자손의 변경은 조상에 아무런 영향을 미치지 않는다.
-여러 개의 부모 클래스 상속할 수 없음
-부모 클래스에서 private 접근 제한 갖는 필드와 메서드는 상속에서 제외
-부모와 자식 클래스가 다른 패키지에 존재할 경우 default 접근 제한된 필드와 메서드 역시 제외
● super 키워드
super.
-super는 자식 클래스가 부모 클래스로부터 상속받은 멤버를 참조할 때 사용하는 참조 변수이다.
-멤버 변수와 지역변수의 이름이 같을 때 this를 사용하듯이
부모 클래스와 자식 클래스 멤버의 이름이 같을 경우 super를 사용한다.
-부모의 변수, 메서드에 접근할 때 사용한다.
-super( ) 괄호 안에 변수를 넣어주면 부모 생성자에서 같은 생성자로 가서 초기화 사용한다.
괄호 안에 가져갈 게 없으면 기본 생성자로 가서 적용된다.
-어떤 종류이던 super는 한 번만 사용 가능.
super()
-super( ) 안에 변수를 넣어주면 부모 생성자에서 같은 생성자로 가서 초기화
-부모 생성자를 호출하는 데 사용
-안 써도 기본으로 들어간다(존재)
-생성자 첫 줄에만 존재한다.
●메서드 오버라이딩
▪오버라이딩(overriding)
-조상 클래스로부터 상속받은 메서드를 재정의 하는 것.
-하위 클래스에서 다시 만들면 상위 클래스의 똑같은 이름의 메서드는 무시된다.
조건
-상속받는 클래스와 선언부가 같아야 한다.(메서드 이름, 매개변수 타입, 매개변수 개수, 리턴 타입)
-접근제어자를 좁은 범위로 변경할 수 없다.
조상의 메서드가 protecte이면, 범위가 같거나 넓은 progected나 public으로만 변경할 수 있다.
-조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.
-인스턴스 메서드를 static메서드로 또는 그 반대로 변경할 수 없다.
▪오버로딩과 오버라이딩 (차이점 알아두기🧐)
- 오버로딩(overoading) : 기존에 없는 새로운 메서드를 정의하는 것
- 오버라이딩(overriding) : 부모 클래스로부터 상속받은 메서드의 내용을 변경하는 것
● 포함
-클래스를 재사용하는 상속 이외의 또 다른 방법
-클래스의 멤버 변수로 다른 클래스를 선언한다.
● 추상 클래스
-'미완성 설계도'이므로 미완성 메서드를 포함하고 있다.
-인스턴스 생성 불가
-추상 클래스를 상속받아서 완전한 클래스를 만든 후에 완성된 설계도(구상 클래스)가 되어야 객체를 생성할 수 있다.
-새로운 클래스를 작성하는데 바탕이 되는 조상 클래스로서 중요한 의미를 갖는다.
-'abstract'를 클래스 이름 앞에 붙여주면 추상 클래스라는 것을 알 수 있다.-
-공통된 부분들만 구현하고 , 공통되지 않은 부분들은 다른 클래스로 상속되어 미완성된 부분들을 재정의하여 완성시키는 클래스
● 추상 메서드
-abstract는 '미완성'의 의미 , 메서드 선언부에 'abstract'를
-메서드의 선언 부만 작성하고 실제 수행 내용은 구현하지 않은 추상 메서드를 선언하는 데 사용한다.
-메서드의 내용은 상속받는 클래스에 따라 달라질 수 있기 때문에
제어자 | 대상 | 의미 |
abstract | 클래스 | 클래스 내에 추상메서드가 선언되어 있음 |
메서드 | 선언부만 작성하고 구현부는 작성하지 않은 추상메서드임 |
● 제어자 (mdifier)
-클래스, 변수 또는 메서드의 선언부에 함께 사용되어 부가적인 의미를 부여한다.
-접근 제어자는 네 가지 중에서 하나만 선택해서 사용할 수 있다.
접근 제어자 | public, protected, defauult, private |
그 외 | static , final, abstract, native, transient, synchronized, colatile, strictfp |
▪ final
-변경될 수 없는 의미를 갖고 있다.
-사용될 수 있는 곳은 클래스, 메서드, 멤버 변수, 지역변수
제어자 | 대상 | 의미 |
final | 클래스 | 변경될 수 없는 클래스, 확장될 수 없는 클래스가 된다.(ex, String, Math) 다른 클래스의 조상이 될 수 없다. |
메서드 | 오버라이딩을 통해 재정의 될 수 없다. | |
멤버변수 | 변수 앞에 final을 붙이면, 값을 변경할 수 없는 상수가 된다. | |
지역변수 |
▪ static
-'클래스의' 또는 '공통적인'의 의미
-사용될 수 있는 곳은 멤버 변수, 메서드, 초기화 블록
제어자 | 대상 | 의미 |
staic | 멤버변수 | 모든 인스턴스에 공통적으로 사용되는 클래스 변수가 된다. 클래스 변수는 인스턴스를 생성하지 않고도 사용 가능하다. 클래스가 메모리에 로드될 때 생성 |
메서드 | 인스턴스를 생성하지 않고도 호출이 가능한 static 메서드가 된다. static 메서드 내에서는 인스턴스 멤버들을 직접 사용할 수 없다. |
▪ 접근 제어자(access modifier)
-접근제어자는 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할
-접근제어자는 생략 가능하며 생략했을 때는 자동으로 default 임을 뜻하게 된다.
-접근제어자가 사용될 수 있는 곳 : 클래스, 멤버 변수, 메서드, 생성자
1.private : 같은 클래스 내에서만 접근이 가능
2. default : 같은 패키지 내에서만 접근이 가능
3. protected : 같은 패키지 내에서, 다른 패키지의 자손 클래스에서 접근이 가능하다.
4. public : 접근 제한이 전혀 없다.
-사용하는 이유(객체지향 개념의 캡슐화에 해당된다.)
외부로부터 데이터를 보호하기 위해서
외부에 불필요한, 내부적으로만 사용되는, 부분을 감추기 위해서
-접근 범위가 넓은 쪽에서 좁은 쪽의 순으로 나열
public (접근 제한 없음) > protected (같은 패키지+자손) > default(같은 패키지) > private(같은 클래스)
제어자 | 같은 클래스 | 같은 패키지 | 자손 클래스 | 전체 |
public | ◯ | ◯ | ◯ | ◯ |
protected | ◯ | ◯ | ◯ | |
default | ◯ | ◯ | ||
private | ◯ |
객체지향 프로그래밍에 해당되는 부분을 배워보았다.
이제야 정말 자바에 대해 배우는구나 실감할 수 있는 단계였다.
아직은 추상 메서드와 추상 클래스가 어느 부분에서 사용되는 건지 체감을 할 수는 없지만, 이에 대한 기능을 이해해보려고 노력해봤습니다.
오버로딩과 오버라이딩 명칭은 비슷하지만 역할은 완전히 다름에서 쉽게 헷갈려 할 수 있음을 깨달았습니다.
갈수록 개념들도 어려워지고 생소해진다. 접근제어자, 상속, 추상메서드 와 같은 중요한 단원들이 나오면서 조금이라도 놓치면 다음 단원을 배울 때 이해하기 어려워질거 같은 느낌을 받으며..여러번 반복해야 함을 느꼈다.
미숙하지만 개념들을 이해하고, 제대로 활용할 수 있도록 연습을 더 많이 해보아야 할 것 같습니다.
'BACK END > JAVA' 카테고리의 다른 글
impor문, 다형성, 인터페이스 (0) | 2022.06.06 |
---|---|
클래스, 메서드, 오버로딩, setter getter, 생성자, 객체배열 (0) | 2022.06.02 |
2일차 : 분기문 contiue와 break (0) | 2022.06.01 |
2일차 : 반복문 (0) | 2022.06.01 |
2일차 : 조건문 (0) | 2022.06.01 |