본문 바로가기

Java/Java 기초

상속 세부개념 및 접근 제한자

1. 상속(inheritance)


기존에 선언된 클래스의 맴버를 새롭게 만들 클래스에서 사용하고 싶을 때 
상속을 받고 새로운 기능만 추가한다

class 슈퍼클래스명 {
           슈퍼클래스의 맴버;
}

class 서브클래스명 extends 슈퍼클래스명{
             슈퍼클래스의 멤버;
             서브클래스의 멤버;
}

※ 자바에서 상속은 단일 상속만 지원한다


(1) super와 super()


1) super : 부모의 참조값
부모의 맴버에 접근할 때 사용한다


2) super(): 부모 생성자

자식 클래스 타입의 객체로 부모 필드에 접근을 할 수 있다

 

우리는 객체를 만들 때 자식 생성자만 호출하기 때문에 자식 필드만 메모리에 할당된다고 생각할 수 있다
그러나 자식생성자는 항상 부모 생성자를 호출한다
이는 자식의 필드를 초기화할 때 부모 필드도 초기화 하는 것을 의미한다
즉, 자식 객체를 생성하면 부모 객체도 생성된다(부모객체가 먼저 생성된다)
부모 생성자를 호출하는 방법은 super()를 사용하면 된다
super()를 작성하지 않더라도 컴파일러가 자동으로 작성해준다


(2) 다형성(polymorphism) : 하나의 것으로 여러 형태를 가진다


1) 오버로딩(메소드, 생성자)
매개변수의 순서, 타입, 개수가 다르면 같은 이름의 메소드를 여러개 선언할 수 있다
반환타입은 영향을 끼치지 않는다


2) 오버라이딩(재정의)
부모 클래스에 정의한 메소드를 자식 클래스에서 수정해서 사용하고 싶다면 
오버라이딩(재정의)를 하면된다
메소드명, 매개변수, 반환타입은 부모에서 정의된 메소드와 동일해야한다
즉, 오버라이딩은 상속관계의 자식클래스에서 한번만 사용할 수 있고
선언부는 부모의 메소드와 동일하고 구현부만 다른 것을 의미한다


+) 다형성(오버로딩, 오버라이딩), this, this(), super, super() 반드시 구분해서 이해하기!!


   1) 오버로딩   : 같은 이름의 메소드명으로 여러개의 메소드를 만들 때 사용
      매개변수의 타입, 순서, 개수가 다르면 같은 이름의 메소드 선언 가능
   2) 오버라이딩 : 부모클래스에서 이미 정의된 메소드를 자식 클래스에서 새로 정의하여 재사용 및 수정하는것
      @Override 어노테이션을 붙여야한다
      상속관계가 되어있어야한다
      메소드의 선언부는 동일해야하고 구현부에서만 내용을 재정의한다
   3) this : 객체 자기 자신
      같은 이름의 지역변수, 인스턴스변수가 있을 때 this 이용해서 인스턴스 변수에 접근가능
      필드에 접근가능    this.name
   4) this() : 자기자신의 생성자
      (현재 클래스의 다른 생성자 호출)
      하나의 클래스에 여러개의 생성자가 있는 경우 한 생성자에서 다른 생성자 호출가능
   5) super : 부모클래스의 멤버 가리키는 참조
      자식클래스에서 부모의 필드나 메소드를 접근할 때 사용
   6) super() : 부모의 생성자
      자식클래스의 생성자에서 부모클래스의 생성자를 명시적으로 호출 시 사용


2. 접근제한자(접근권한 제어자, 접근자)


접근제한자 제한대상 제한범위
public 클래스, 필드, 생성자, 메소드 없음
protected 필드, 생성자, 메소드 같은 패키지이거나 자식 객체만 사용가능
(default) 클래스, 필드, 생성자, 메소드 같은 패키지
private 필드, 생성자, 메소드 객체 내부(같은 클래스)
+다른곳에서 사용할경우 메소드로 사용가능


(1) 클래스의 접근제한자


public 다른 패키지에서도 제한 없이 사용가능
(default)  같은 패키지에서는 제한 없이 사용가능하지만 다른 패키지는 사용 불가


(2) 생성자의 접근제한자


public 모든 패키지에서 생성자 호출 가능(=모든 패키지에서 객체 생성 가능)
(default) 같은 패키지에서만 생성자 호출 가능(=같은 패키지에서만 객체 생성 가능)
private 클래스 내부에서만 생성자 호출 가능(=클래스 내부에서만 객체 생성 가능)


(3) 필드와 메소드의 접근제한자


접근제한자 생성자 설명
public   필드 모든 패키지에서 필드 읽고 변경 가능
메소드 모든 패키지에서 메소드 호출 가능
protected 필드, 생성자, 메소드  같은 패키지이거나 자식 객체만 사용가능
(defalut) 필드 같은 패키지에서만 필드 읽고 변경 가능
메소드 같은 패키지에서만 메소드 호출 가능
private 필드 클래스 내부에서만 필드 읽고 변경 가능
메소드 클래스 내부에서만 메소드 호출 가능


(4) getter, setter


getter와 setter의 접근 제한자는 public이다
setter 매개변수로만 값을 저장해준다
리턴타입 void
메소드명 set + 필드명(첫문자만 대문자)
매개변수의 타입은 필드 타입
ex) public void setScore(int score){
              this.score = score;
}
getter 값을 외부로 리턴해준다
리턴타입은 필드의 타입
메소드명 get + 필드명(첫문자만 대문자)
매개변수는 필요없다
리턴값은 필드값
ex) public int getScore(){
                return score;
}



(5) final 클래스와 final 메소드


final 최종을 의미하는 키워드
final 변수 : 더 이상 값을 바꿀 수 없기 때문에 상수
final 클래스 : 최종적인 클래스, 더 이상 상속해줄 수 없는 클래스
public final class 클래스명 {...}
자식클래스를 만들 수 없는 클래스
대표적인 클래스 : String 클래스
final 메소드 : 최종적인 메소드, 오버라이딩을 할 수 없는 메소드
부모클래스에서 메소드에 final을 사용하면 자식클래스에서 재정의 할 수 없다

'Java > Java 기초' 카테고리의 다른 글

추상클래스와 인터페이스  (0) 2023.12.21
Casting (형변환)  (0) 2023.12.20
this, static, 상속 개념  (0) 2023.12.18
클래스와 생성자  (0) 2023.12.15
오버로딩과 클래스  (0) 2023.12.14