JAVA - 5. 상속, 접근제한자, 오버라이딩

CodeModel·2024년 1월 23일
0

자바

목록 보기
6/8

상속

부모의 메소드를 자식이 상속받을 수 있다

public class Car {
	// run 메소드
	public void run() {
    	System.out.println("달린다");
    }
}

// Car 클래스 extends로 상속
public class Bus extends Car {
	// stop 메소드
	public void stop() {
    	System.out.println("멈춘다");
    }
}

// Java 메인
main {
	Bus bus = new Bus();
    bus.run(); // "달린다"
    bus.stop(); // "멈춘다"
    car.stop(); // 오류
}

접근제한자

외부에 노출시키지 않고싶은 메소드와 필드가 있을 것 이다

public - 어떤 클래스던 접근할 수 있다.
protected - 같은 패키지인 경우 접근 가능, 다른 패키지라도 상속을 받은 경우 접근 가능
default - 아무것도 쓰지 않은 경우, 자기 자신과 같은 패키지만 접근 할 수 있다
private - 자기 자신만 접근 가능

public > protected > default > private

public class Access {
	public int a = 1;
    protected int b = 2;
    int c = 3;
    private int d = 4;
}

추상클래스

추상클래스는 구체적이지 않은 클래스를 의미한다. 독수리, 파랑새, 참새는 구체적인 새 이지만, 새, 포유류 등은 구체적이지 않다.

// 클래스명과 메소드 리턴 타입에 abstract를 적어준다
public abstract class Bird {
	// 추상 메소드 생성
	public abstract void sing();
    // 추상 메소드가 아닌 일반 메소드도 만들 수 있다.
    public void fly() {
    	system.out.println("날다");
    }
}

// Bird 클래스를 상속받는 Duck 클래스 생성
public class Duck extends Bird {
	public void sing()	{
    	System.out.println("꽥꽥");
    }
}

// Java 메인
main {
	Duck duck = new Duck();
    duck.sing();		// 꽥꽥
    duck.fly();			// 날다
    
    Bird b = new Bird();	// 오류 - 추상클래스는 인스턴스를 생성할 수 없음
}

super

부모 클래스를 상속받는 자식 클래스의 인스턴스가 만들어 진다면 부모 클래스의 기본 생성자를 실행한 후 자식클래스의 기본 생성자를 실행한다. 이때 자식 클래스에는 super(); 함수가 없어도 자동으로 super(); 함수가 실행된다. 직접 적어줄 수도 있다.

하지만 부모 클래스에 기본 생성자가 없다면 super();에 부모의 생성자에 맞는 인자를 넣어서 꼭 호출해줘야 한다

나를 가르키는 키워드가 this라면 부모를 가르키는 키워드는 super 이다

// 부모 클래스를 생성한다
public class Car1 {
	// 생성자 생성
    public Car () {
    	System.out.println("기본 생성자")
    }
}

// 자식 클래스를 생성한다
public class Truck1 extend Car1 {
	// 부모에게 기본 생성자만 있다면
	// super()이 없어도 자동으로 super() 실행
}

//	-----------------------------------------------	//

// 부모 클래스를 생성한다
public class Car2 {
	String name;
	// 생성자 생성
    public Car (String name) {
    	this.name = name;
    }
}

// 자식 클래스를 생성한다
public class Truck2 extend Car2 { 
	int num;
    // 부모에게 기본 생성자가 없고 매개변수를 받는 생성자가 있다면
    // super()에 인자를 넣어서 적어줘야한다
    public Truck2 (String name,int num) {
    	    super(name);
    }

}

//	-----------------------------------------------	//

// Java 메인
main {
	Truck1 t1 = new Truck1();			// "기본 생성자"
    Truck2 t2 = new Truck2("트럭2");
}

오버라이딩

오버라이딩이란 부모가 가지고 있는 메소드와 똑같은 모양의 메소드를 자식이 가지고 있는 것이다. 즉 오버라이딩이란 메소드를 재정의 하는 것이다.

// 부모 클래스를 생성한다
public class Car {
	// 메소드 생성
    public void run() {
    	System.out.println("달려");
    }
}

// 자식 클래스를 생성한다
public class Truck extend Car {
	// 오버라이딩
    public void run() {
    	System.out.println("트럭달려");
        
        // super.run() 을 할 경우 부모의 run 메소드를 실행한다
    }
}

// Java 메인
main {
	Truck t = new Truck();
    t.run()				// 트럭달려
    // super가 있을 경우
    t.run()				// 달려 트럭달려
}

형변환

부모 객체 Car와 그 부모를 상속받는 객체 Bus가 있다고 하자 이럴때
Car c = new Bus(); 로 인스턴스를 생성한다면 Car 클래스에 있는 메서드는 사용할 수 있지만 Bus클래스 내부에 있는 인스턴스는 사용할 수 없다. 이럴때
Bus bus = (Bus)c 로 형 변환 하여 사용할 수 있다

profile
개발자가 되기 위한 일기

0개의 댓글