본문 바로가기

JAVA

JAVA(2022.05.07)-추상클래스, super와 부모생성자, 오버라이딩

추상클래스

 

개념 : 모든 자동차는 클락션 소리가 난다. 그러나 자동차 종류마다 다르다. 어떤 자동차는 빵빵, 어떤 자동차는 띠띠.

추상클래스는 자동차 클락션 소리를 구현해주고 이를 상속하여 승용차 class, 경차 class에서 클락션 소리를 각각의 특성에 맞게 구현할 수 있도록 한다. 

 

정의

클래스 이름 앞에 abstract 키워드를 붙인다

추상클래스는 미완성 추상 메소드를 포함할 수 있다(메소드 선언부인 {} 가 없다는 의미) > 대신, 리턴타입 앞에 abstract라고 붙여줘야 한다 

*그러나 추상클래스를 상속받게 되면 해당 클래스에서 상속 받은 추상메소드를 반드시 구현해줘야한다. > 그러지 않으면 해당 클래스도 추상클래스가 됨* 

추상클래스는 인스턴스 생성이 불가능하다 

 

 

 

코드예시

ex)

추상클래스 car

    public abstract class Car{
        public abstract void sound();
		// Car는 모두 소리를 낸다는 추상메소드 
        
        public void engine(){
            System.out.println("엔진이 있다.");
            
        // Car는 모두 엔진이 있다는 걸 알려주는 메소드 
        }
    }

    

car 클래스를 상속받은 benz차 

public class Benz extends Car{
    @Override
    public void sound() {
    //Car클래스의 추상메소드sound의 구현부를 작성하며 abstract를 지움으로써 추상메소드가 아님을 보여줌 
        System.out.println("슉슉");
         }
    }

benz차를 시험하는 클래스

public class Exam{
	public static void main(String args[]){
    	benz fathercar = new benz;
        fathercar.sound();
        fathercar.engine();
      
      
 		//car mycar = new car(); > 오류를 발생시킴 추상클래스는 인스턴스화 불가능      
       }
 }

 

super와 부모생성자

 

 

부모생성자

 

 

    public class Mom{
        public Mom(){
            System.out.println("엄마입니다.");
        }
    }

 

    public class Son extends Mom{
        public Son(){
            System.out.println("엄마의 아들입니다.");
        }

    }

>부모의 기본생성자가 있을때

    public class Exam{
        public static void main(String args[]){
            Son son = new Son();
        }
    }

결과 :

엄마입니다.

엄마의 아들입니다. 

 

이유는?

- Son 객체가 올라갈 때 부모인 Mom도 함께 메모리에 저장되기 때문이다. 생성자 호출 시 자동으로 부모의 생성자가 먼저 호출되며 부모객체를 초기화한다. 

 

 

super

부모의 생성자를 호출하는 메소드

부모의 기본생성자가 아닌 다른생성자 호출 

    public class Mom{
        public Mom(String s){
            System.out.println(s+"엄마입니다.");
        }
    }
    public class Son extends Mom{
        public Son(){
            super("준서");
            //매개변수를 받는 생성자 호출 
            System.out.println("엄마의 아들입니다.");
        }

    }

부모의 기본생성자가 없기 때문에 자식클래스에서 super을 통해 부모 생성자를 호출해야 정상적으로 컴파일이 된다.

 

super.(super레퍼런스)

 

ex) 부모의 클래스에도 int x; 자식의 클래스에도 int x; 가 있다고 하자. 이를 출력하고 싶을 때 부모의 x를 출력하고 싶다면 super.x를 입력해서 출력이 가능하다 

 

 

오버라이딩

 

- 오버라이딩이란 부모클래스의 메소드를 자식클래스에서 재정의하여 사용하는 것이다 

 

위에서 작성한 코드를 예시로 다시 들어보자

    public abstract class Car{
        public void sound(){
        	System.out.println("위잉위잉");
            }
		
        public void engine(){
            System.out.println("엔진이 있다.");
            
        // Car는 모두 엔진이 있다는 걸 알려주는 메소드 
        }
    }

 

public class Benz extends Car{
    @Override
    public void sound() {
    
        System.out.println("슉슉");
         }
    }

 

public class Exam{
	public static void main(String args[]){
    	benz fathercar = new benz();
        fathercar.sound();
        
      
      
 		    
       }
 }

결과 

슉슉

 

이유는?

메소드를 오버라이드 하면 항상 자식클래스에서의 정의된 메소드가 호출된다

 

여기서 부모클래스의 메소드까지 호출하고 싶다면? 

 

public class Benz extends Car{
    @Override
    public void sound() {
    	super.sound();
        //부모의 sound메소드 호출. super레퍼런스를 사용하는 것이다
    
        System.out.println("슉슉");
         }
    }

 

 

 

 

 

 

 

 

 

 

 

 

*본 게시물은 프로그래머스<자바입문>강의를 복습하며 작성한 글입니다.