본문 바로가기
Web/JAVA

상속(Inheritance), overriding, package, import, 제한자

by 당진개발자 2024. 1. 17.

1. 상속 (is a)

- 기존(상위) 클래스의 자산(멤버 변수, 멤버 메서드)을 자식(하위) 클래스에서 재사용하기 위한 것

- extends 키워드를 사용 ("자식 클래스명 extends 부모 클래스명 {}")

- Object 클래스는 모든 클래스의 조상 클래스이다.

- Object 클래스의 메서드 : hashCode(), equals(), toString()

- 자바에서는 단일 상속만을 지원한다. >> 다중 상속을 하기 위해서는 interface와 포함 관계로 단점을 극복

- 포함 관계(has a) : 2개 이상의 클래스에서 특성을 가져올 때 하나는 상속, 나머지는 멤버 변수로 처리

※ SpriderMan2는 Person이다(is a), SpiderMan2는 Spider를 가진다(has a)

public class SpiderMan2 extends Person{
	Spider spider; // reference type => null : 에외 처리 필요
	boolean isSpider;
	
    public SpiderMan() {
    	this.spider = new Spider();
    }
    
	void fireWeb() {
		if (isSpider) {
			spider.fireWeb();
		} else {
			System.out.println("거미줄 발사X");
		}
	}
}

 


 

2. 메서드 오버라이딩(overriding)

- 조상 클래스에 정의된 메서드를 자식 클래스에서 적합하게 수정하는 것

- 메서드 이름, 리턴타입, 개수, 타입, 순서가 모두 같아야한다.

- 접근 제한자는 부모 보다 범위가 넓거나 같아야 한다.

- 조상보다 더 큰 예외를 던질 수 없다.

- "가까운 순서부터 찾는다!!"

 


 

3. super

- super 키워드를 통해 조상클래스에 접근이 가능하다. (ex. super.메서드명())

- 변수의 scope : method 내부 >> 해당 클래스 멤버 변수 >> 조상 클래스 멤버 변수

class Parent {
    String x = "parent";
}

class Child extends Parent {
    String x = "child";

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

public class ScopeTest {

    public static void main(String[] args) {
        Child child = new Child();
        child.method();
    }
}

 

- super를 통해 조상 클래스의 생성자 호출이 가능하다.

- super()는 자식 클래스 생성자의 맨 첫 줄에서만 호출 가능 (this()와 같이 쓸 수 없다.)

- 컴파일러가 "this()나 super()"가 없으면 명시적으로 super()를 삽입한다.

Person(String name) {
	// super(); // --> Object의 기본 생성자 명시적 삽입
	this.name = name;
}

 


 

 

4. Annotation

- 컴파일러, JVM, 프레임워크 등이 보는 주석

- 컴파일러에게 "확인 한번 해주세요"

- @Deprecated : "앞으로 없어질 수도 있어요"

- @Override : "오버라이딩한 메서드에요"

- @SuppressWarnings : "사소한 warning은 신경쓰지 마세요"

 


 

5. Package

- 많은 클래스 >> 패키지 이용

- 모든 클래스는 반드시 하나의 패키지에 속한다.

- com.ssafy(회사명).hrm(project).common(용도)

 


 

6. import

- 다른 패키지에 선언된 클래스를 사용하기 위한 키워드

- " import 패키지명.클래스명 or * "

- 자동 임포트 : ctrl + shift + O

 


 

7. 제한자(modifier)

- 클래스, 변수, 메서드, 생성자 선언부에 함께 사용되어 부가적인 의미 부여

- 접근 제한자 : public, protected, defalut(package), private

- 그 외 제한자 : static("메모리에 먼저 올라가 있어라"), final(더 이상 수정 불가), abstract(추상 클래스 or 추상 메서드 작성)

- 접근 제한자는 하나만 사용 가능

 


 

8. final

- 마지막, 더이상 바뀔 수 없음, 완벽하다

- final class : 더 이상 확장 X >> 상속 금지 >> 오버라이딩 금지 , ex) Math, String

- final method : 더 이상 재정의 할 수 없음 >> 오버라이딩 금지

- final variable : 더 이상 값을 바꿀 수 없음(상수)

- Blank final : 생성자에서 한번만 초기화 할 수 있고 변경할 수 없다.

- static final : 단지 final만 있으면 객체마다 갖는 값으로 공용성이 없음, 진정한 상수는 객체와 무관하게 모두가 공용하는 값. ex) Math.PI

 


 

9. 접근제한자

 

- protected, private는 클래스 앞에 붙을수 없다.

- protected 키워드를 사용할 경우 상속관계가 있을 경우 = public, 없을 경우 = defalut