Java - 11

하승·2022년 7월 11일
0

웹 개발반 - Java

목록 보기
11/19
post-thumbnail

접근 권한 제어자

다른 패키지 혹은 다른 클래스에서 해당 필드에 접근할 수 있는
권한을 설정해주는 키워드들

(default)	: 다른 패키지에서 접근 불가	- 귀찮을 때
public		: 모든 곳에서 접근 가능	- 다른 곳에서 사용이 될 때
private		: 다른 클래스에서 접근 불가	- 데이터 감추기
protected	: 다른 패키지에서 접근 불가 / 단, 상속받은 자식 클래스 내부에서는
		자신의 필드처럼 접근이 가능하다. - 자식에게만 건네줄 데이터

private 필드는 직접 접근할 방법이 하나도 없기 때문에 무조건 public 메소드를 통해서
간접적으로 접근한다.(값을 사용하는 경우 : getter / 값을 수정하는 경우 : setter)

추상 클래스(불완전한 클래스)

추상적인 내용만 정의하고 있는 클래스로, 구체적인 내용은
상속받아 하위 클래스에서 구현되도록 설계된 클래스이다.
추상 클래스(부모)는 클래스들(자식)의 공통 요소들을
가상화 시켜놓기 떄문에 객체화시 구현(재정의)을 꼭 해야한다.
부모 추상 클래스의 역할은 단지 자식클래스들을 만들 때 도와주는
역할을 수행한다. 즉 클래스들의 틀 역할을 한다. 그렇기 때문에
자식 클래스에서 생성되어야 할 메소드의 이름과 형태만 가지고 있다.
즉 메소드에 {}(바디)가 없다. 이런 메소드를 추상 메소드라고 하며,
리턴타입 앞에 abstract 라는 키워드를 붙여준다. 추상 메소드가
하나라도 포함되어 있다면 추상 클래스로 만들어야 한다.

추상클래스 선언

abstract class 클래스명{
	abstract 리턴타입 추상메소드명();
}
추상 메소드는 자식 클래스에서 강제적으로 반드시 재정의 해야하지만	
final 메소드는 자식 클래스에서 재정의가 불가능하다.
일반 메소드도 추상 클래스 내부에 존재할 수 있다.
package zoo;
public abstract class Animal {
	String name;
	String gender;
	int age;
	
	//final 메소드는 자식 클래스에서 재정의가 불가능하다.
	final void intro() {
		System.out.println("나는 동물입니다");
	}
	
	abstract void makeSomeNoise();
	
	//추상 클래스는 일반 메소드도 선언 가능하다.
	void eat() {
		System.out.println(name+"이(가) 냠냠 먹는중...");
	}
}

인터페이스

추상클래스를 고도화시킨 문법이며, 반드시 추상메소드와 상수만
선언해야 한다. 다른 클래스에서 인터페이스를 상속받을 때에는
implements 를 사용한다. 상속받은 클래스는 인터페이스가
가지고 있던 추상 메소드를 반드시 재정의 해야한다.

jdk 8 버전 이후부터는 인터페이스에 default 메소드를 선언할 수 있다.	
따라서 사실상의 다중상속을 지원하게 된다. 인터페이스 끼리 메소드 모호성이 
발생한다면 상속받고 있는 클래스에서 명시적으로 재정의를 통해 모호성을
해결해 주어야 한다. 만약 클래스와 인터페이스 끼리 모호성이 발생한다면
클래스의 메소드가 우선시 되어 모호성이 자동으로 해결된다.

간단한 인터페이스 테스트

아까 위에서 추상 클래스 예시로 썼던 Zoo 패키지안에
Mammal 이라는 인터페이스를 하나 만들어준다.

package zoo;
public interface Mammal {
	abstract void eungAe();
}

그 후 Whale 클래스를 만들어 Mammal 인터페이스를 상속 받는다.

package zoo;
public class Whale implements Mammal {
	String name;
    
	// Mammal 인터페이스에 있는 추상메소드를 재정의 해준다.
	@Override
	public void eungAe() {
		System.out.println(name + "한마리만 낳아서 잘 키우자");
	}
}
public class Test{
	public static void main(String[] args) {
		Whale whale = new Whale();
		whale.name = "고래";
        whale.eungAe();
    }
}

이제 실행을 해본다면

인터페이스 상속이 잘 된 것을 볼수 있습니다!

profile
화이팅!

0개의 댓글