1. 상속

부모가 가진 것을 자식에게 물려주는 것

 

s a 관계 혹은 kind of 관계
노트북은 컴퓨터의 한 종류 침대는 가구의 한 종류 == 침대는 가구 소방차는 자동차

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

    public class Car{

    }

    public class Bus extends Car{

    }

자바는 클래스 이름 뒤에 extends 키워드를 적고 부모클래스 이름을 적게 되면

부모 클래스가 가지고 있는 것을 상속받을 수 있게 된다.

 == 부모가 가지고 있는 것을 자식이 사용할 수 있게 된다.

 

부모클래스에 메소드 추가하기

  • Car에 run()메소드를 추가
    public class Car{
        public void run(){
            System.out.println("달리다.");
        }
    }

 

  • Car를 상속받은 Bus 사용
    public class BusExam{
        public static void main(String args[]){
            Bus bus = new Bus();
            bus.run();  
            //Bus class 는 아무런 코드를 가지지 않는다. 그럼에도 run 이라는 메소드를 사용하는데 문제가 발생되지 않는다. 
        }   
    }

 

  • Bus에 메소드 추가
    public class Bus extends Car{
        public void sound(){
            System.out.println("빵빵");
        }       
    }
  • Bus는 Car에서 물려받은 run메소드와 sound메소드를 사용할 수 있게 된다.
  • 부모가 가지고 있는 메소드외에 추가로 메소드를 선언하는 것을 확장하였다고 표현한다.
 

2. 접근제한자

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

 

클래스 내에 필드와 메소드를 아무거나 가지고 있게 하기보다는

관련된 내용을 가지고 있게 하는 것이 좋음.

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

 

접근제한자 종류

public protected default  private
모든 접근을 허용.
가장 넓은 의미. 전체공개
같은 패키지인 경우 접근 허용.
다른 패키지라도
상속받은 경우 접근 허용
아무것도 쓰지 않은 경우.
자기 자신과
같은 패키지 내에서 접근 허용

자기자신만 접근 가능.
나만보기.

 

    public class AccessObj{
        private int i = 1;
        int k = 2; // default 접근 제한자
        public int p = 3;
        protected int p2 = 4;
    }

 

AccessObj를 사용하는 AccessObjExam

  - AccessObj의 필드 i 의 접근 제한자는 private이므로 다른 클래스인 AccessObjExam에서 접근할 수 없다.

    public class AccessObjExam{
        public static void main(String args[]){
            AccessObj po = new AccessObj();

            System.out.println(po.i);  // private이라 컴파일 오류 발생
            System.out.println(po.k);  // default -> 같은 패키지라 접근가능
            System.out.println(po.p);  // publi -> 모두 접근가능
            System.out.println(po.p2); // protected -> 같은 패키지라 접근가능
        }
    }

 

AccessObj 와 다른 패키지에서 사용해보기

패키지가 달라졌기때문에 default접근제한자로 지정된 필드 k 와

protected 접근제한자로 지정된 필드 p2 도 접근할 없다.

    public class AccessObjExam{
        public static void main(String args[]){
            AccessObj po = new AccessObj();

            System.out.println(po.i);   // private이라 컴파일 오류 발생
            System.lout.println(po.k);  // default -> 다른 패키지라 컴파일 오류 발생
            System.lout.println(po.p);  // publi -> 모두 접근가능
            System.lout.println(po.p2);  // protected -> 다른 패키지라 컴파일 오류 발생
        }
    }

 

AccessObjExam을 AccesObj로 부터 상속받도록 수정한 후 사용해 보기

패키지는 다르지만 상속관계에 있으므로 protected 접근제한자로 지정된 필드 p2에 접근할 수 있다.

    public class AccessObjExam extends AccessObj{
        public static void main(String[] args) {
            AccessObjExam obj = new AccessObjExam();
            System.out.println(obj.p);  // publi -> 모두 접근가능
            System.out.println(obj.p2); // protected -> 패키지 다르지만 상속받은 자식class라 접근 가능
            System.out.println(obj.k);  // default -> 같은 패키지 아니라 접근가능
            System.out.println(obj.i);  //  private이라 컴파일 오류 발생
        }
    }
접근 제한자는 필드 뿐 아니라 메소드와 클래스에도 붙여서 사용 가능함.
접근 제한자에 따라서 접근 허용 범위를 정의할 수 있음.
 

3. 추상클래스

 

: 구체적이지 않은 클래스

 ex) 독수리, 타조는 구체적인 새를 지칭하는데 새, 포유류 같은 것은 구체적이지 않다.

이런 것을 구현한 클래스를 추상 클래스라고 한다.

 

얘네는 부모로서의 역할은 수행할 수 있지만 객체가 될수는 없음.

객체는 구체적인 클래스만 가능함.

 

추상 클래스 정의하기

  • 추상 클래스는 클래스 앞에 abstract 키워드를 이용해서 정의한다.
  • 추상 클래스는 미완성의 추상 메소드를 포함할 수 있다.
  • 추상 메소드란, 내용이 없는 메소드 이다. 즉 구현이 되지 않은 메소드이다.
  • 추상 메소드는 리턴 타입 앞에 abstract라는 키워드를 붙여야 한다.
  • 추상 클래스는 인스턴스를 생성할 수 없다.
  • 메소드가 하나라도 추상메소드가 되면 그 메소드가 속한 클래스는 무조건 추상클래스가 되어야함.
  • 하지만 추상 클래스 내부에도 일반 메소드를 구현 할 수 있음.
    public abstract class Bird{
        public abstract void sing();

        public void fly(){
            System.out.println("날다.");
        }
    }

 

추상 클래스를 상속받는 클래스 생성하기

  • 추상 클래스를 상속받은 클래스는 추상 클래스가 갖고 있는 추상 메소드를 반드시 구현해야 한다.
  • 추상 클래스를 상속받고, 추상 클래스가 갖고 있는 추상 메소드를 구현하지 않으면 해당 클래스도 추상 클래스가 된다.
    public class Duck extends Bird{
        @Override
        public void sing() {
            System.out.println("꽥꽥!!");
        }
    }

 

사용하기

  • Bird는 추상 클래스 이므로 객체를 생성할 수 없다.
    public class DuckExam { 
        public static void main(String[] args) {
            Duck duck = new Duck();
            duck.sing();
            duck.fly();

            //Bird b = new Bird(); 이건 불가능함. 추상클래스 자체로 객체를 만들수는 없기 때문
        }   
    }

 

 

 

 

 

+ Recent posts