본문 바로가기

Java

[Java] 25

내부 클래스

- 클래스 내부에 선언된 클래스

- 클래스 내부에 클래스를 선언함으로써 외부 클래스의 필드를 마음대로 사용할 수 있다.

- 단독으로 동작할 필요가 없어서 굳이 밖에 만들 필요가 없을 때 사용한다.

1. 인스턴스 클래스

- 외부클래스 외부인스턴스 = new 외부클래스();

- 외부클래스.내부클래스 내부인스턴스 = 외부인스턴스.new 내부클래스();

2. 스태틱 클래스

- 외부클래스.내부클래스 내부인스턴스 = new 외부클래스.내부클래스();

3. 지역 클래스

- 메소드 안에 선언된 클래스로 메소드 영역에서만 사용이 가능하다.

4. 익명 클래스(무명 클래스)

- 이름이 없는 클래스를 의미하고, 일회성으로 사용할 때 활용한다.

A라는 클래스에서 b라는 작업이 자주 쓰이고, b라는 작업은 B클래스를 만들어야 쉽게 관리할 수 있다.

하지만 A라는 클래스를 제외한 다른 클래스에서 b라는 작업이 필요없을 때와

   B클래스를 노출하지 않고 A클래스 안에서만 자유롭게 활용하고 싶을 때 사용한다.

캡슐화

- 외부로부터 은닉하는 행위

- getter, setter, 접근제어자, 내부클래스


 

 

 

 

실습(인스턴스 클래스)

1. 인스턴스 클래스 생성

public class Outer {

	InnerInstance ii = new InnerInstance();
	int ov = 10;  // 인스턴스 변수
	
	class InnerInstance{  // 인스턴스 클래스
		int iiv = 20;

		public void printName() {
			System.out.println(ov);
		}

	}
	
}

 

2. Main.java에서 실행

public class Main {
	public static void main(String[] args) {
		
		// 인스턴스 클래스 객체화 하기
		Outer o = new Outer();
		Outer.InnerInstance ii = o.new InnerInstance();

		System.out.println(ii.iiv);
		
		o.ii.printName();

	}
}

결과

 

 

​​

실습(static 클래스)

1. static 클래스 생성

public class Outer {
	
	static class InnerStatic{  // 스태틱 클래스
		int isv = 30;
	}
	
}
 

2. Main.java에서 실행

import innerTest.Outer.InnerStatic;

public class Main {
	public static void main(String[] args) {

		// 스태틱 클래스 객체화 하기
		Outer.InnerStatic is = new Outer.InnerStatic();
		System.out.println(is.isv);
		
	}
}

 

결과

 

실습(지역 클래스)

1. 지역 클래스 생성

public class Outer {

	public void f() {

		// 메소드 내부에서만 클래스가 필요할 때 사용한다.
		class InnerLocal{  // 지역 클래스
			int ilv = 40;
		}

		InnerLocal il = new InnerLocal();
		System.out.println(il.ilv);

	}
	
}

 

2. Main.java에서 실행

public class Main {
	public static void main(String[] args) {

		Outer o = new Outer();
		
		o.f();
		
	}
}

 

결과

 

 

​​

실습(익명 클래스)

1. Car.java 생성

public class Car {

	String name;
	
	public void go() {
	}

}

 

2. Main.java에 익명 클래스 생성 및 Car.java의 메소드 오버라이드

import interTest.Soldier;

public class Main {
	public static void main(String[] args) {

		// 익명클래스
		Soldier s = new Soldier() {
			
			@Override
			public void work() {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void sleep() {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void eat() {
				// TODO Auto-generated method stub
				
			}
		};
		
		Car c = new Car() {
			@Override
			public void go() {
				System.out.println("override된 메소드");
			}
			
			public void engineOn() {
				System.out.println("버튼으로 시동 켬");
			}
			
		};
		
		c.name = "홍길동";
		c.go();
//		c.engineOn();  // 새롭게 만든 메소드는 사용 불가
		
	}
}

 

결과

 

 

'Java' 카테고리의 다른 글

[Java] 27  (0) 2022.01.28
[Java] 26  (0) 2022.01.26
[Java] 24  (0) 2022.01.24
[Java] 23  (0) 2022.01.23
[Java] 22  (0) 2022.01.22