[Java 기초] 객체지향언어의 특성 1. 상속

김재희·2023년 10월 12일
0
post-custom-banner

객체지향언어의 특성

1. 상속성

상속성을 통해 자식 클래스에서 반복적으로 중복된 코드를 작성할 필요 없이, 부모 클래스에 선언된 코드를 재사용해서 유지 보수성이 매우 편리해진다.

🔶 특징

  • 모든 클래스는 하나의 클래스만 상속 받을 수 있다.
  • 키워드 : extends
  • Java에서 모든 Class는 Object Class (클래스 가장 상위 계층)를 상속 받고있다.
  • .toString()
    모든 하위 클래스는 toString()을 @override 해서 사용하는게 좋다.
//출력을 요구할때, .toString()이 붙으면 자기자신의 값이 나타나게 된다.
public class Exam_05 {
	public static void main(String[] args) {
		A05 ap = new A05(); //ap는 데이터의 주소값을 가지고있는 참조변수
		System.out.println("ap.getClass = " + ap.getClass()); 
											//Object클래스가 getClass를 갖고있어서 상속 받아서 출력가능함
		System.out.println("ap.toString = "+ap.toString());
		System.out.println("ap = "+ap);//ap뒤에 .toString() 생략되어있음 / ap라는 주소값을 출력
	}
}

🔶 상속관계, 포함관계

// 상속 관계
Class Person
Class Student extends Person // A Student is a person.
Class Police extends Person

// 포함 관계
Class Circle { // Circle has a Point.
	Point p = new Point();
}

🔶 super와 super(), @Override

super는 부모로부터 받은 멤버와 자식의 멤버 이름이 같을때 부모 멤버에 접근하기 위해 사용한다.

  • 자신이 상속받은 부모의 생성자를 호출하는 super() 메소드
  • 생성자 내에서만 사용이 가능
  • 반드시 첫번째 줄에 와야한다.
  • 설정하지 않으면 컴파일러가 부모의 default 생성자를 자동으로 호출한다.

오버라이드는 부모의 메소드와 똑같은 메소드를 자식이 만들어서 사용하고, 메소드 호출시 오버라이드된 메소드가 실행된다. 자식이 부모에 없는 예외전가를 만들 수는 없다.

// super 예제
import java.io.*;

class A06{
	int a;
	int b;
	public A06() { //부모클래스의 생성자
		a=10;
		b=20;
	}
	public A06(int a, int b) {
		this.a = a;
		this.b = b;
	}
	public void disp() throws IOException{ //예외전가
		//disp()메소드를 실행하는데 IOException이 발생할 수 있습니다. 만약에 발생이 되면
		//disp()메소드를 호출한 곳에서 처리하겠습니다.
		System.out.println("좌표 : ["+a+","+b+"]");
	}
}

class B06 extends A06{ //a, b, c=30
	int c;
	int b;
	public B06() {
		//super(100, 200); //부모클래스의 생성자를 호출, super() - 부모클래스의 디폴트생성자
		//= A06클래스의 A06()생성자를 호출
		c=30;
		b=100;
	}
	@Override //어노테이션(@:길잡이) //반드시 써야하는건 아니지만 써주면 프로그램에 도움이 됨
	public void disp() throws IOException{ //예외전가(부모에 없는 예외전가를 자식은 만들 수 없다.)
		//disp()메소드를 실행하는데 IOException이 발생할 수 있습니다. 만약에 발생이 되면
		//disp()메소드를 호출한 곳에서 처리하겠습니다.
		System.out.println("좌표 : ["+a+","+super.b+","+c+"]"); 
						//super.b => 생략되어있는 this로 인해 B06클래스에 있는 b값(100)을 가져오기때문에 부모클래스에 접근하여 가져오기!
						//super가 있을때는 20 출력, 없을때는 100(자기자신) 출력
	}
}
public class Exam_06 {
	public static void main(String[] args) throws IOException{ //예외처리 안하겠다고 눈속임하는 것
		//부모이름과 자식이름을 같게 만드는 것 : 오버라이드
		B06 ap = new B06();
		ap.disp(); //호출된 곳(main)에서 처리해줘야함
		
		/*
		A06 ap = new A06();
		ap.disp();
		B06 bp = new B06();
		bp.disp2();
		*/
	}
}

🔶 protected 접근제한자

상속관계에서는 public처럼 접근이 가능하다. 상속관계가 아니라면 같은 패키지 내에서만 default처럼 접근 가능하다.

// sungjuk 패키지 protected 예제

package sungjuk;

public class SungJuk {
	private String name;
	private int kor, eng, rank;
	protected int tot; // 상속관계가 아닌 Test01 클래스에서는 default처럼 접근 가능
	
	public SungJuk(String name, int kor, int eng){
		this.name = name;		this.kor = kor;		this.eng = eng;
		tot = kor + eng;		rank = 1;
	}
	
	public String getName() {		return name;	}
	public void setKor(int kor) {		this.kor = kor;	}
	public int getKor() {		return kor;	}
	public void setEng(int eng) {		this.eng = eng;	}
	public int getEng() {		return eng;	}
	public void setTot() {		tot = kor + eng;	}
	public int getTot() {		return tot;	}
	public int getRank() {		return rank;	}
	
	public void clearRank() {		rank = 1;	}
	public void plusRank() {		rank++;	}	
	public void disp() {
		System.out.println(name+"님의 총점은 " + tot +"점이고, 순위는 " + rank +"등 입니다.");
	}
}
package sungjuk;

public class Test01 {
	public static void main(String[] args) {
		SungJuk sj = new SungJuk("aaa", 100, 100);
		sj.tot = 100;		
	}
}

다음 포스팅은 2. 다형성, 3. 추상화

profile
소통하며 협업하는 신입 백엔드 개발자입니다.
post-custom-banner

0개의 댓글