본문 바로가기
자바(Java)

자바 입문하기13 - 상속, 접근제한자, 추상클래스, super

by codeyaki 2022. 1. 11.
반응형

해당 강의를 보고 정리한 것입니다.

https://programmers.co.kr/learn/courses/5

 

자바 입문

자바 입문 가장 널리 쓰이는 프로그래밍 언어 Java로 프로그래밍의 기초를 다져보세요. 이 강의의 내용을 책으로 만나고 싶으시면 여기를 눌러 책 정보를 확인하세요. 강의를 다 들었는데, 지금

programmers.co.kr


상속

: 부모가 가진 것을 자식에게 몰려주는 것을 의미

  • 노트북은 컴퓨터의 한 종류
  • 침대는 가구의 한 종류, 혹은 침대는 가구
  • 소방차는 자동차

해당 관계들을 "is a" 관계 혹은 "kind of" 관계라고 함.

 

Car를 상속받은 Bus를 class로 표현하는 방법

  • 부모 클래스 Car
    public class Car {
    	String name;
    	int number;
    	
    	public Car() {
    	}
    	public Car(String name) { //생성자
    		this.name = name;
    	}
    	public Car(String name, int number) {
    		this.name = name;
    		this.number = number;
    	}
    	public void run() {
    		System.out.println("달리는 중");
    	}
    }​
  • 자식 클래스 Bus
    public class Bus extends Car{
    
    }​
    클래스명 뒤에 "extends 부모클래스명"을 적어주면 부모 클래스가 갖고 있는 것들을 상속받을 수 있게 된다.
    즉, 부모가 가지고 있는 것들을 자식이 사용할 수 있게 된다.
  • 상속 받은 메서드 사용하기
    public class BusExam {
    	public static void main(String[] args) {
    		Bus bus = new Bus();
    		bus.run();
    	}
    
    }​
    >>달리는 중
  • Bus 확장하기
    public class Bus extends Car{
    	public void ppangppang() {
    		System.out.println("빵빵");
    	}
    }
    부모가 가지고 있는 메서드 외에 추가로 메서드를 선언하는 것을 확장하였다고 표현함.
    부모클래스에선 사용할 수 없음.
    public class BusExam {
    	public static void main(String[] args) {
    		Bus bus = new Bus();
    		bus.run();
    		bus.ppangppang();
    		
    		Car car = new Car();
    		car.ppangppang; // 오류
    	}
    
    }​

접근 제한자

클래스 내에서 멤버의 접근을 제한하는 역할

(캡슐화 : 관련된 내용을 모아서 가지고 있는 것)

 

접근 제한자의 종류

  • public : 모든 접근 허용
  • protected : 같은 패키지인 경우, 다른 패키지라도 상속을 받은 경우 접근 허용
  • private : 자기 자신만 접근 가능( 모든 접근 불가)
  • default : 아무것도 쓰지 않을 경우, 같은 패키지에서만 접근 가능

 

  • AccessObj 클래스
public class AccessObj {
	private int pri = 5;
	int de = 2; // default
	protected int pro = 7;
	public int pub = 10;	
}
  • AccessObjExam 클래스
public class AccessObjExam {
	public static void main(String[] args) {
		AccessObj obj = new AccessObj();
		System.out.println(obj.pri);
		System.out.println(obj.de);
		System.out.println(obj.pro);
		System.out.println(obj.pub);
	}

}

같은 패키지일 경우

  1. obj.pri : (private) 접근 불가능
  2. obj.de : (defalut) 같은 패키지 이므로 접근 가능
  3. obj.pro : (protect) 같은 패키지 이므로 접근 가능
  4. obj.pub : (public) 모든 접근 가능

다른 패키지의 경우

  1. obj.pri : (private) 접근 불가능
  2. obj.de : (defalut) 다른 패키지이므로 접근 불가능
  3. obj.pro : (protect) 다른 패키지이므로 접근 불가능
  4. obj.pub : (public) 모든 접근 가능

AccessObjExam클래스가 AccessObj의 자식 클래스일 경우(상속받은 경우)

  1. obj.pri : (private) 접근 불가능
  2. obj.de : (defalut) 다른 패키지이므로 접근 불가능
  3. obj.pro : (protect) 상속받은 패키지이므로 접근 가능
  4. obj.pub : (public) 모든 접근 가능

추상 클래스

: 구체적이지 않은 클래스.

독수리, 타조는 구체적으로 지칭하는데 새, 포유류 같은 것들은 구체적이지 않다. 이런 것들을 구현한 클래스

 

추상 클래스 정의 방법&특징

  • 클래스 앞에 abstract 키워드를 사용하여 정의
  • 미완성의 추상 메서드를 포함할 수 있다.
      - 추상 메서드 : 내용이 없는 메서드. 즉, 구현이 되지 않은 메서드
      - 방법 : 리턴 타입 앞에 abstact키워드 사용 ( {} 사용 X )
  • 인스턴스를 생성할 수 없다

  • 추상 클래스 생성
public abstract class Bird {
	public abstract void sing();
	public void fly() {
		System.out.println("날다");
	}
}

     - Bird bird = new Bird(); 와 같은 인스턴스 생성은 불가능

 

  • 추상 클래스 상속받는 클래스 생성
    - 추상 클래스를 상속받은 클래스는 추상 클래스가 갖고 있는 추상 메서드를 반드시 구현해야 한다.
    추상 클래스를 상속받고, 추상 클래스가 갖고 있는 추상 메서드를 구현하지 않으면 해당 클래스도 추상 클래스
public class Duck extends Bird{
	public void sing(){
		System.out.println("꿱꿱");
	}
}
  • 사용
    public class DuckExam {
    	public static void main(String[] args) {
    		Duck duck = new Duck();
    		duck.sing();
    	}
    }​

super와 부모 생성자

: class가 인스턴스화 될 때 생성자가 실행되면서 객체의 초기화를 한다. 그때 자신의 생성자만 실행이 되는 것이 아니고, 부모의 생성자부터 실행된다.

 

  • 부모 생성자
    public class Car {
    	String name;
    	int number;
    	
    	public Car() {
    		System.out.println("Car 기본 생성자");
    	}
    }
  • 자식 생성자
    public class Bus extends Car{
    	public Bus(){
    		System.out.println("Bus의 기본생성자");
    	}
    }
  • 생성자 테스트
    public class BusExam {
    	public static void main(String[] args) {
    		Bus bus = new Bus();
    	}
    }​
    >>
    Car 기본 생성자
    Bus의 기본 생성자
  • new연산자로 Bus객체 생성 시, Bus객체가 메모리에 저장될 때 부모인 Car도 함께 메모리에 저장
  • 생성자는 객체를 초기화하는 일을 함.
  • 생성자가 호출될 때 자동으로 부모의 생성자가 호출되면서 부모 객체를 초기화하게 된다.

super

  • 부모 클래스를 가리키는 키워드
  • 자식 클래스에서 부모의 메서드나 필드를 사용할 때 사용
  • super() : 부모의 생성자
  • 부모의 생성자를 임의로 호출하지 않으면, 부모 클래스의 기본 생성자가 자동으로 호출됨.
    public class Bus extends Car{
    	public Bus(){
    		super();
    		System.out.println("Bus의 기본생성자");
    	}
    }​

부모의 기본 생성자가 아닌 다른 생성자를 호출하는 방법

  • 클래스는 기본 생성자가 없는 경우도 존재
    public class Car {
    	String name;
    	int number;
    	public Car(String name) { //생성자
    		this.name = name;
    		System.out.println("Car(" + name + ") 생성자");
    	}
    }​
      - Car 클래스가 해당 코드로 수정되면, Bus 생성자에서 오류가 발생.
      - 원인 : 부모 클래스에 기본 생성자가 없기 때문에 컴파일 오류가 발생
      - 해결방법 : 자식 클래스의 생성자에서 직접 부모의 생성자를 호출.
    public class Bus extends Car{
    	public Bus(){
    		super("소방차");
    		System.out.println("Bus의 기본생성자");
    	}
    }

 

반응형