상속

codakcodak·2023년 7월 19일
0

Java

목록 보기
9/17
post-thumbnail

상속

  • 기존(상위) 클래스의 자산(멤버)를 자식(하위) 클래스에서 재사용하기 위한 것
  • 한 개의 클래스만 상속받을 수 있다.(단일상속)
  • 모든 클래스는 기본적으로 java.lang.Object를 상속 받는다.
//SpiderMan	.java
class Person {
	String name;
	
	void eat() {
		System.out.println("먹습니다");
	}
	void jump() {
		System.out.println("점프합니다.");
	}
}
public class SpiderMan extends Person{
	boolean isSpider;
	SpiderMan(String name){
		this.name=name;
	}
	void fireWeb() {
		System.out.println("거미줄을 사용합니다.");
	}
	void printName() {
		System.out.println(this.name);
	}
}
//SpiderManTest.java	
public class SpiderManTest {

	public static void main(String[] args) {
		SpiderMan sm1=new SpiderMan("Harry");
		sm1.eat();
		sm1.fireWeb();
		sm1.printName();
	}
}
먹습니다
거미줄을 사용합니다.
Harry

*SpiderMan is a Person

Has a관계

  • 단일상속의 단점을 보완하기 위함
  • 2개 이상의 클래스에서 특성을 가져올 때 하나는 상속,하나는 멤버 변수로 처리하는 기법
//Person.java
public class Person {
	String name;
	
	void jump() {
		System.out.println("보통점프!");
	}
}
//SpiderMan.java
public class SpiderMan extends Person{
	Spider spider=new Spider();

	void fireWeb() {
		if(this.isSpider) {
			spider.jump();//Spider는 상속받지 못하기에 멤버 변수로 처리하여 특성을 사용
		}else {
			super.jump();
		}
	}
	
}
  • SpiderMan has a Spider

오버라이딩

//Person.java
public class Person {
	void jump() {
		System.out.println("점프!");
	}
}
public class SpiderMan extends Person{
	void jump() {//Person의 jump()를 오버라이딩 하여 덮어씌웠다.
		System.out.println("거미 점프!");
	}
}
  • 조상 클래스에 정의된 메서드를 자식클래스에서 덮어 씌우는 것
  • 메서드 이름이 같아야한다.
  • 매개 변수의 개수,타입,순서가 같아야 한다.
  • 리턴 타입이 같아야한다.
  • 접근 제한자는 부모 보다 범위가 넓거나 같아야 한다.
  • 조상보다 큰 예외를 던질 수 없다.

super

1.기본사용

//Person.java
public class Person {
	void jump() {
		System.out.println("점프!");
	}
}
public class SpiderMan extends Person{
	boolean isSpider;
	SpiderMan(String name){
		this.name=name;
	}
	void jump() {
		if (isSpider) {
			System.out.println("거미점프~!");
		}else {
			super.jump();
		}
	}
}
  • 조상 클래스 멤버를 접근한다.
  • 조상 클래스를 초기화 한다.

2.스코프

class Parent{
	String x="parent";
}
class Child extends Parent{
	String x="child";
	
	void method() {
		String x="method";
		System.out.println("x : "+x);
		System.out.println("this.x : "+this.x);
		System.out.println("super.x : "+super.x);
	}
}

public class ScoreTest {
	public static void main(String[] args) {
		Child child=new Child();
		child.method();
	}
}
x : method
this.x : child
super.x : parent

*Child는 Parent에게 상속받았지만 이미 동일한 변수의 이름이 있어 this.name은 상속받지 못했다.

3.기본 생성자

  • super()은 조상 클래스의 생성자를 호출한다.
  • super()은 자식 클래스 생성자의 맨 첫 줄에서만 호출 가능하다.
  • 명시적으로 this() 또는 super()를 호출하지 않는 경우 컴파일러가 자동으로 super()를 삽입한다.
class Person1{
	String name;
    //1번 
	Person1(String name){
		this.name=name;
	}
}

public class SpiderManTest extends Person1 {
	Boolean isSpider;
//	SpiderManTest(){
//		아무것도 없다면 다음 super()가 자동으로 삽입된다. 하지만 현재 Person1()이라는 생성자가 정의되어 있지 않으므로 오류가난다.
//	}
    //2번
	SpiderManTest(String name,boolean isSpider){
		super(name);//1번생성자 사용
		this.isSpider=isSpider;
	}
    //3번
	SpiderManTest(String name){
		this(name,true);//2번생성자 사용
	}
	
	public static void main(String[] args) {
		SpiderManTest sp1=new SpiderManTest("피터");
	}
}

Annotation

  • 소스코드에 메타 데이터를 삽입하여 약속된 의미를 나타낸다.

1.@Deprecated

  • 컴파일러에게 해당 메서드가 deprecated되었다고 알려준다.

2.@Override

  • 컴파일러에게 해당 메서드는 override한 메서드 임을 알려준다.

3.@SupperWarnings

  • 컴파일러에게 사소한 warning의 경우 신경 쓰지 말라고 알려준다.
profile
숲을 보는 코더

0개의 댓글