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();
}
}