본문 바로가기

Language/Java

[JAVA] Super

1.Super란? 

자식 클래스에서 부모 클래스의 매소드를 부분적으로 사용 해야 하는 경우가 있을 것이다. 

지금까지 들어온 카메라 클래스를 예로 들어보자. 

**사전 참고 사항 (부모 클래스와 자식클래스)**

 

// 부모 클래스
public class Camera {
    public String name;

    public Camera() {
        this.name = "카메라"
    }

    public void takePicture() {
        // 사진 촬영
        System.out.println(this.name + ": 사진을 촬영합니다.");
    }

    public void recordVideo() {
        // 동영상 녹화
        System.out.println(this.name + ": 동영상을 녹화합니다.");
    }

    public void showMainPicture() {
        System.out.println(this.name + "의 주요 기능 : 사진 촬영, 동영상 녹화");
    }
}
// 자식 클래스 1 - FactoryCam
public class FactoryCam extends Camera {
    public FactoryCam() {
        this.name = "공장 카메라";
       
    }

    public void detectFire() {
        //화재 감지
        System.out.println("화재를 감지합니다.");
    }
    public void showMainPicture() {
        System.out.println(this.name + "의 주요 기능 : 화재 감지");
    }
}
//자식 클래스2 - SpeedCam
public class SpeedCam extends Camera {

    public SpeedCam() {
       this.name = "과속단속 카메라";
    }

    public void checkSpeed() {
        // 속도 체크
        System.out.println("속도를 측정합니다.");
    }

    public void recognizeLicensePlate(){
        // 번호 인식
        System.out.println("차량 번호를 인식합니다.");
    }

    @Override// annotation -> 컴파일 하는 컴퓨터에게 설명하기 위한 주석 (우리가 지금 오버라이딩을 썼다고 알림)

    public void showMainPicture() {
        System.out.println(this.name + "의 주요 기능 : 속도 측정, 번호 인식");
    }
}

만약 공장 카메라가 영상을 찍는 동시에 화재 감지를 한다면? 

과속단속 카메라가 사진을 찍는 동시에 속도체크와 차량번호 인식을 한다면? 

부모 클래스의 takePicture() 매소드와 recordVideo()매소드를 들고와서 오버라이딩 하여 표현할 수 있을 것이다. 

 

// FactoryCam 안에 있는 매소드 
public void recordVideo() {
        // 동영상 녹화
        System.out.println(this.name + ": 동영상을 녹화합니다.");
        // 동일 클래스 내 매소드를 호출
        detectFire();
    }
//SpeedCam 안에 있는 매소드
public void takePicture() {
    // 사진 촬영
    System.out.println(this.name + ": 사진을 촬영합니다.");
    checkSpeed();
    recognizeLicensePlate();
}

하지만 이렇게 표현한다면, 상속을 쓰는 의미가 없다. 상속을 왜 썼는가? 공통된 내용을 상속 받으므로써 불필요한 중복을 피하기 위함이었다. 하지만 부모 클래스의 모든 매소드를 일일히 오버라이딩 한다면, 불필요한 중복이 커진다. 

이를 위해 쓰는 것이 super라는 키워드이다. super는 해당 클래스의 부모클래스에 접근하게 해준다.  

위의 내용을 super를 통해 바꾸면 다음과 같다. 

public void recordVideo() {
    //부모클래스의 레코드 비디오를 먼저 수행하라.
    super.recordVideo();
    detectFire();
}
public void takePicture() {
    super.takePicture();
    checkSpeed();
    recognizeLicensePlate();
}

이러면 해당 부모 클래스의 takePicture()와 recordVideo()가 몇 줄이든, 코드 1행으로 커버가 가능하다. 

 

**자식 클래스의 생성자를 Super로 표현하는 경우**

부모 클래스의 매소드나 변수 접근 시 : super.매소드 이름(); or super.변수이름;

부모 클래스의 생성자 접근시 : super(들어갈 인수);

 

//부모 클래스
public class Camera {

	// 생성자가 두 개 (오버로딩 이용) : 개발자가 생성자 호출하는 경우의 수를 두 개로 나눠놓은 것
	
    public camera(){
     this.name = "카메라";
    }
    
    // 다른 패키지에 있더라도 자식을 자처하면 이 생성자에 접근할 수 있게 protected keyword를 씀
    protected camera (String name) {
    this.name = name;
    }
    
}
// 부모 클래스의 두번째 생성자로 접근하여 각자 인스턴스 변수를 초기화

public class FactoryCam extends Camera {
	public FatoryCam(){
    	super("공장 카메라");
    }
}


public class SpeedCam extends Camera {
	public SpeedCam() {
    	super("과속단속 카메라");
    }
}

 

2. 점검

super가 하는 역할
super.매소드이름 or 변수; 
super(파라미터 들어갈수도 있음);

'Language > Java' 카테고리의 다른 글

[JAVA]final  (0) 2023.01.29
Chap07_13 참조(reference)  (0) 2023.01.29
일반 변수와 참조 변수 바로 알기  (0) 2023.01.28
[JAVA] 다형성(polymorphis)  (0) 2023.01.28
[JAVA]Overriding(덮어쓰기)  (0) 2023.01.27