- 접근 권한 제어자

다른 패키지 혹은 다른 클래스에서 해당 필드를 접근 할 수 있는 범위를 설정해주는 키워드

 

접근 권한 제어자 의미
(default) 다른 패키지에서 접근 불가
public 모든곳에서 접근 가능
private 다른 클래스에서 접근 불가
protected 다른 패키지에서 접근 불가, 단 자식은 가능

 

1. 다른 패키지에서 어떤 객체로 해당 필드에 접근하고 싶을 때 : public

2. 다른 곳에서 해당 필드에 절대 접근하지 못하게 하고 싶을 때 : private

3. 상속 받은 클래스에서 자신의 필드처럼 쓰게하고 싶을 때 : protected

4. 현재 패키지에서만 이용할 때 : (default) 

 

(default)는 다른 패키지일 때 상속 시켜주어도 자신의 필드처럼 사용이 불가능하다.

그렇지만 protected는 다른 패키지여도 상속시켜준다면 자신의 필드처럼 사용이 가능하다.

 

private 필드는 직접 접근할 방법이 전혀 없기 때문에 public 메소드를 통해서 간접 접근이 가능하다.

 ( 값을 사용하는 경우 : getter / 값을 수정, 세팅하는 경우 : setter)

 


private 사용 해보기!

public class AcessTest {
	int data = 10;
	public int data2 = 20;
	private int data3 = 30;
	
	// Alt + Shift + S  > R  :getter, setter 만드는 단축키
	// getter
	public int getData3() {
		return data3;
	}
	//setter
	public void setData3(int data3) {
		this.data3 = data3;
	}
}
public class AccessMain {
	public static void main(String[] args) {
		AcessTest at = new AcessTest();
		
		// private 사용할려면 getter 사용
		System.out.println("Data3 : " + at.getData3());
		
		at.setData3(40);
		
		System.out.println("바뀐 Data3 : " + at.getData3());
	}
}

 

 
위 코드의 결과

 

 


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

추상적인 내용만 정의하고 있는 클래스로, 구체적인 내용은 상속받은 하위 클래스에서 구현하도록 설계된 클래스이다.

(클래스들의 틀)

추상 클래스(부모)는 클래스들(자식)의 공통요소들을 가상화 시켜놓기 때문에 객체화 시 구현(재정의)를 꼭 해야한다.

부모 추상 클래스의 역할은 자식 클래스를 만들 때 도와주는 역할을 수행한다.

 

 

- 추상 클래스의 특징

자식 클래스에서 선언해야 하는 메소드들의 이름과 형태만 가지고 있다.

즉, 메소드에 { } (바디)가 없다. 이런 메소드들을 추상 메소드라고 하며, abstract라는 키워드가 리턴 타입앞에 붙는다.

추상 메소드가 클래스 내에 하나라도 포함되어 있다면 그 클래스는 추상 클래스로 선언해야 한다.

 

 

- 추상 클래스의 선언

absteract class 클래스명 {

(필드선언)

abstract 리턴타입 추상메소드명();

}

 

추상 메소드는 자식 클래스에서 강제적으로 반드시 재정의해야한다. (강제성 부여)

일반 메소드도 추상 클래스 내부에 존재할 수 있다.

 

 


추상 클래스 사용해보기!

 

추상 클래스 - Animal, 자식 클래스 - Cat, 메인 클래스 - Ground 선언 후

makeSomeNoise 메소드 재정의 하기!

 

Animal 클래스

 

Cat 클래스
Ground 클래스
// 추상 클래스 Animal
public abstract class Animal {
	String name;
	int age;
	
	public Animal(String name, int age) {
		name = this.name;
		age = this.age;
	}
	
	// 추상 메소드 선언
	abstract void makeSomeNoise();
	
	
}

위의 설명과 같이 추상클래스 내부에 있는 추상 메소드는 바디가 없고 선언만 되어져 있다. 이를 Animal 클래스를 상속받는 Cat 클래스에서 재정의를 해주어야한다.

// 추상클래스 상속
// Cat 클래스
public class Cat extends Animal {

	public Cat(String name, int age) {
		super(name, age);
	}

	@Override
	void makeSomeNoise() {
		System.out.println("야옹");
	}
}
public class Ground {
	public static void main(String[] args) {
		Cat cat = new Cat ("나비", 10);
		
		cat.makeSomeNoise();
	}
}

 


 

- 인터페이스

추상 클래스를 고도화시킨 문법이며, 반드시 추상메소드와 상수만 선언되어야 한다.

다른 클래스에서 인터페이스를 지정받을 때에는 "implements"를 사용한다.

지정받은 클래스는 인터페이스가 갖고 있는 추상 메소드들을 반드시 재정의해야한다.

 

public interface 인터페이스명 {

상수, 추상메소드 선언

}

 

 

- 인터페이스의 특징

인터페이스는 상수와 추상메소드로만 선언이 가능하기 때문에 abstract 키워드를 붙이지 않고 선언해도 상수와 추상메소드로 선언된다.

 


- 내부 클래스 (inner Class)

클래스 내부에 클래스를 선언하여 외부 클래스의 필드에 용이하게 접근하기 위해서 사용한다.

내부 클래스의 필드를 사용하기 위해서는 외부클래스 객체에서 .(하위연산자, 점)을 찍고 내부 클래스를 객체화 해야한다.

하지만 외부 클래스의 필드에서는 자신이랑 같이 올라와있는 내부클래스를 바로 객체화 할 수 있다.

 

 

- 내부 클래스를 사용하는 이유

  1. 상속 처럼 사용 : 외부 클래스의 필드를 마치 내 것처럼 접근하여 사용하기 위해서
  2. 캡슐화 : 외부 클래스가 없다면 내부 클래스도 존재할 수 없기 때문에 다른 클래스에서 접근하지 못하도록 내부 클래스를 숨기기 위해서

 

 
 

 

복사했습니다!