본문 바로가기
Java/기본 개념 및 클래스

[Java] 77. 내부 클래스

글: Song hyun 2024. 5. 14.
728x90
반응형

[Java] 77. 내부 클래스

1. 내부 클래스란?

2. 내부 클래스의 종류

 


 

1. 내부 클래스란?

내부 클래스(ineer class)란 한 클래스 내부에 선언된 클래스를 말한다. 내부 클래스를 선언하게 되면, 내부 클래스와 외부 클래스라고 표현할 수 있다. 내부 클래스는 보통 외부 클래스와 연관이 있는 경우가 많고, 다른 곳에서 거의 사용할 일이 없는 경우에 내부 클래스를 선언해 활용하게 된다.

 

2.내부 클래스의 종류

(1) 멤버 내부 클래스

(2) 정적 내부 클래스

(3) 지역 내부 클래스 : 특정 메서드 내에서만 정의되고 사용되는 클래스로, 메서드 실행 시에만 존재하고 메서드의 지역 변수처럼 동작한다. 외부에서 접근이 불가능하고, 주로 일회성 활동

(4) 익명 내부 클래스

 


(1) 멤버 내부 클래스

package useful.ch07;

class Book {
    private String title;
    private Author author;

    // 생성자에서 책의 제목과 저자의 정보를 초기화
    public Book(String title, String authorName, String authorEmail) {
        this.title = title;
        this.author = new Author(authorName, authorEmail);
    }

    public void printBookDetails() {
        System.out.println("Book Title: " + title);
        System.out.println("작가 이름 : " + author.name + ", 이메일 : " + author.email);        
    }

    // 멤버 내부 클래스
    class Author {
        private String name;
        private String email;

        // 생성자에서 저자의 이름과 이메일을 초기화
        public Author(String name, String email) {
            this.name = name;
            this.email = email;
        }
    }
}
package useful.ex06;

public class BookTest {
	
	public static void main(String[] args) {
		
		// 멤버 내부 클래스를 사용하는 설계 방식의 주요 이점 
		// 캡슐화를 강화 
		//  - 내부적으로 어떤 기능이 있는지 숨길 수 있다 
		// 로직의 응집도 향상 
		// - 특정 기능이나 데이터를 사용하는 코드를 한 곳에 모으면,
		//   코드의 응집도가 향상됩니다.
		// 이는 코드를 이해하고 유지보수하기 쉽게 만들어 줍니다.
		Book book = new Book("홍길동전", "허균", "허균@example.com");
		book.printBookDetails();
		
		// 외부에서 Book 안에 있는 내부클래스 Author에 쉽게 접근이 안됨 
	}
}

(2) 정적 내부 클래스

package useful.ch07;

import useful.ch07.Spaceship.Engine;

public class SpaceshopTest {
	public static void main(String[] args) {
		
		Spaceship spaceship = new Spaceship();
		spaceship.startSpaceShip();
		
		// 외부에서 엔진을 만들어서
		// spaceship 주입시켜야 한다.
		
		Engine 누리호1번엔진 = new Engine();
		Engine 누리호2번엔진 = new Spaceship.Engine();
		Engine 누리호3번엔진 = new Spaceship.Engine();
		// 변수명은 한글로 작성하지 말자 !!
		
		System.out.println("----------");
		spaceship.addEngine(누리호3번엔진);
		spaceship.startSpaceShip();
		
		// 사용하는 이유
		// 논리적인 그룹화
		// 정적 내부 클래스는 외부 클래스와 논리적을
		// 관련있는 클래스들을 그룹화하는 데 유용하다.
	}

}

 

728x90
반응형