JAVA 기초

JAVA 12-2

Vanillwa 2023. 8. 29. 00:01

Inner Class (내부 클래스)

클래스 내부에 선언된 또 다른 클래스를 의미한다

package ex1_innerClass;

//내부클래스 : 클래스 안에서 만들어진 클래스 (중첩클래스)
//두 클래스의 멤버(변수)들 간 손쉬운 접근 가능
//불필요한 클래스를 감춰 코드의 복잡성을 최소화

class Calculator { //outer class
	int val1, val2;
	
	public Calculator(int val1, int val2) {
		this.val1 = val1;
		this.val2 = val2;
	}
	//내부클래스는 내부의 위치에 따라서 구분가능
	//인스턴스 : 외부클래스의 멤버변수들과 같은 위치
	//정적 : 외부클래스의 변수와 같이 static 키워드 부여
	//지역 : 외부클래스의 메서드 내에서 생성 
	//익명 : 이름이 없는 클래스
	public class Calc { //inner class
		public int add() {
			return val1 + val2;
		}
	}
	
}

public class CalculaterEx {
	public static void main(String[] args) {
		//내부 클래스의 객체 생성법
		//Outer "outer객체명" = new Outer(); 외부클래스 객체 생성
		//Outer.Inner "inner객체명" = "outer객체명".new Inner();
		//내부 클래스 객체를 만들기전에 외부 클래스 객체 먼저 생성해야 함
		
		Calculator cal = new Calculator(10, 7);
		Calculator.Calc c = cal.new Calc();
		
		System.out.printf("10 + 7 = %d\n", c.add());
	}
}

실행 결과


정적 내부 클래스

package ex1_innerClass;
//정적 클래스
class PrintOut {
	
	int val1;
	//외부클래스의 변수와 메서드를 내부클래스에선 사용 불가
	public static class Out {
		public void println(String str) {
			System.out.println(str);
		}
	}
}

public class StaticClassEx {
	public static void main(String[] args) {
		String str = "정적 내부 클래스 테스트";
		//정적 내부 클래스 객체 생성법
		//Outer."inner 객체명" = new Outer.Inner();
		PrintOut po = new PrintOut();
		PrintOut.Out o = new PrintOut.Out();
		
		o.println(str);
	}
}

실행 결과


 

로컬 내부 클래스

package ex1_innerClass;
//지역 클래스
public class LocalClassEx {
	private int speed = 10;
	
	public void getUnit(String unitName) {
		
		//unitName = unitName+"님"; <-불가
		//지역클래스에서 메서드 내의 변수를 사용할 땐 값을 복사해서 사용
		
		class Unit {
			public void move() {
				System.out.printf("%s이 %d의 속도로 이동합니다.",unitName,speed);
			}
		}
		Unit unit = new Unit();
		unit.move();
	}
	
	public static void main(String[] args) {
		LocalClassEx local = new LocalClassEx();
		local.getUnit("마린");
	}
}

실행 결과

 


익명 내부 클래스

package ex2_person;

interface ButtonClickListener{
	public void click(); //추상 메서드
}

public class AnonymousEx {
	
	//버튼 객체를 내부 클래스로 선언
	public class Button{
		private ButtonClickListener listener;
		
		public void setListener(ButtonClickListener listener) {
			this.listener = listener;
		}
		
		//버튼 클릭 기능
		public void click() {
			if(listener != null) {
				listener.click();
			}
		}
	}
	
	public static void main(String[] args) {
		//outer 객체
		AnonymousEx exam = new AnonymousEx();
		//inner 객체
		AnonymousEx.Button button = exam.new Button();
		
		button.setListener(new ButtonClickListener() {
			
			@Override
			public void click() {
					System.out.println("버튼을 눌렀습니다.");			
			}
		}/*익명클래스*/);
		
		button.click();
	}
}

실행 결과

 

'JAVA 기초' 카테고리의 다른 글

JAVA 13-2  (0) 2023.08.29
JAVA 13-1  (0) 2023.08.29
JAVA 12-1  (0) 2023.08.28
JAVA 11-3  (0) 2023.08.25
JAVA 11-2  (0) 2023.08.25