본문 바로가기

Backend Study/Java

[JAVA] 제어자, 다형성, 인터페이스, 내부 클래스와 익명 클래스

1. 제어자란?

- 클래스, 변수, 메서드의 선언부에 사용되어 부가적인 의미를 부여한다. 

- 접근 제어자: public, protected, default, private

- 그 외: static, final, abstract, native

 

1.1 static - 클래스의, 공통적인

멤버 변수 :

모든 인스턴스에 공통적으로 사용되는 클래스변수가 된다. 

클래스변수는 인스턴스를 생성하지 않고도 사용 가능하다.

클래스가 메모리에 로드될 때 생성된다.

 

메서드:

인스턴스를 생성하지 않고도 호출이 가능한 static 메서드가 된다.

static 메서드 내에서는 인스턴스 멤버들을 직접 사용할 수 없다.

 

1.2 final - 마지막의, 변경될 수 없는

클래스, 메서드, 멤버변수, 지역변수에 사용 가능

 

1.3 abstract - 추상의, 미완성의

클래스: 클래스 내에 추상메서드가 선언되어 있음을 의미한다.

메서드: 선언부만 작성하고 구현부는 작성하지 않은 추상메서드임을 알린다.

 

1.4 접근 제어자

멤버 또는 클래스에 사용되어, 외부로부터 접근을 제한한다.

클래스, 멤버변수, 메서드, 생성자에 사용 가능하다.

 

private: 같은 클래스 내

default: 같은 패키지 내

protected: 같은 패키지 내에서, 그리고 다른 패키지의 자손 클래스에서 접근 가능

public: 접근 제한이 없다.

 

2. 다형성이란? 

하나의 참조변수로 여러 타입의 객체를 참조할 수 있는 것. 

 

3. 인터페이스란?

- 일종의 추상클래스이며 추상화정도가 높다.

- 실제 구현된 것이 없는 기본 설계도이다.

- 인스턴스를 생성할 수 없고, 클래스 작성에 도움을 줄 목적으로 사용된다.

- 구성 요소는 추상메서드와 상수만 가능하다.

- 클래스처럼 상속이 가능하며, 클래스와 달리 다중상속을 허용한다. 

- object 클래스와 같은 최고 조상이 없다.

 

장점) 

- 개발시간을 단축시킬 수 있다.

- 표준화가 가능하다

- 서로 관계없는 클래스들에게 관계를 맺어줄 수 있다.

- 독립적인 프로그래밍이 가능하다.

 

4. 내부 클래스란?

- 클래스 안에 선언된 클래스

- 특정 클래스 내에서만 주로 사용되는 클래스를 내부 클래스로 선언한다.

- 변수의 선언 위치에 따른 종류와 동일하며, 유효범위와 성질도 변수와 유사하다.

 

5. 익명 클래스란?

- 클래스 안에 선언된 클래스

- 특정 클래스 내에서만 주로 사용되는 클래스를 내부 클래스로 선언한다.

- 변수의 선언 위치에 따른 종류와 동일하며, 유효범위와 성질도 변수와 유사하다.

- 프로그램에서 일시적으로 한번만 사용되고 버려진다. 재사용성이 없고, 확장성을 활용하는 것이 유지보수에서 더 불리할 때 사용한다.

(지역변수처럼 사용된다고 생각하면 쉽다.)

 

class Animal {
	public String bark(){
    	return "동물이 짖는다."; 
    }
}

public class Main{
	public static void main(String [] args){
    
   	/* 클래스의 정의와 객체화를 동시에 한다. */ 
    	Animal cat = new Animal(){
        	@Override
            public String bark(){
            	return "이번에는 고양이가 짖는다.";
            }
        };
    }
}

 

만약에 오버라이딩이 아닌 새로운 메서드를 선언한다면? 

class Animal {
	public String bark(){
    	return "동물이 짖는다."; 
    }
}

public class Main{
	public static void main(String [] args){
    
   	/* 클래스의 정의와 객체화를 동시에 한다. */ 
    	Animal cat = new Animal(){
        	@Override
            public String bark(){
            	return "이번에는 고양이가 짖는다.";
            }
            
             public String fight(){
            	return "이번에는 고양이가 강아지랑 싸운다.";
            }
            
        };
    }
}

부모인 Animal 클래스에는 fight 함수가 없기 때문에, 외부에서는 사용하지 못하고 익명 클래스 내에서만 호출이 가능하다.

'Backend Study > Java' 카테고리의 다른 글

[JAVA] 쓰레드, 프로세스, 멀티 쓰레드  (0) 2023.01.26
[JAVA] 컬렉션 프레임워크  (0) 2023.01.26
[JAVA] 상속  (0) 2023.01.26
[JAVA] 생성자  (0) 2023.01.26
[JAVA] 배열, 변수와 메서드  (0) 2023.01.26