내부클래스
- 내부클래스는 클래스 안에 만들어진 또 다른 클래스로 중첩 클래스라고도 부름.
-클래스에 또 다른 클래스를 선언하는 이유는 두개의 클래스가 서로 긴밀한 관계를 맺고있기 때문에
인스턴스 클래스 선언)
public class Outer {
private String name; ---> 인스턴스멤버.
//...
public class Inner {
private String name; ------> 인스턴스 클래스
//...
}
}
인스턴스 클래스 예시)
public class Calculator {
private int val1;
private int val2;
public Calculator(int val1, int val2) {
this.val1 = val1;
this.val2 = val2;
}
//내부클래스 - 인스턴스클래스 선언
//인스턴스 클래스는 외부클래스의 변수/메서드 사용가능
public class Calc {
public int add() {
return val1 + val2;
}
}
}
public class CalcMain {
public static void main (String[] args) {
Calculator cal = new Calculator(12, 20);
//내부클래스 선언
Calculator.Calc calc = cal.new Calc();
//내부클래스 메서드 실헹
System.out.println("더하기 값 : " + calc.add());
}
}
-> 더합기 값 : 32
정적 내부 클래스 선언)
public class Outer {
private String name; -----> 인스턴스 멤버
public static class Inner {
private String name; ----> 정적내부클래스
//...
}
}
정적 내부클래스 예시)
public class PrintOut {
//정적 클래스 선언
public static class Out {
public void println(String str) {
System.out.println(str);
}
}
public static void main(String[] args) {
PrintOut.Out out = new PrintOut.Out();
String str = "정적내부클래스"
out.println(str);
}
}
-> 정적내부클래스
지역클래스 선언)
public class Local class {
//...
public void print () {
//...
class A { ---------->지역클래스 선언
//...
}
A a = new A(); -----------> 메서드 내에서 사용
}
}
지역클래스 예시)
public class Unit {
private int speed = 10;
public void getUnit(String type, String unitName) {
class Tank{
public void move() {
System.out.println(unitName + " 이(가) " + speed + " 속도로 이동.");
}
}
class Ship{
public void move() {
System.out.println(unitName + " 이(가) " + speed + " 속도로 이동.");
}
}
Tank t = null;
Ship s = null;
if(type.equals("ship")) {
s = new Ship();
s.move();
}else if(type.equals("tank")) {
t = new Tank();
t.move();
}
}
public class UnitMain {
public static void main(String[] args) {
Unit unit = new Unit();
unit.getUnit("tank", "K9");
}
}
-> k9이(가) 10 속도로 이동.