클래스 안에 만들어진 또 다른 클래스로 중첩 클래스라고도 한다.
클래스 안에 다른 클래스를 선언하는 이유는 두개의 클래스가 서로 긴밀한 관계를 맺고 있기 때문이다.
내부클래스의 종류
1.인스턴스 클래스
외부클래스의 필드와 같은 위치에 선언 (외부클래스의 멤버처럼 다루어진다.)
주로 외부클래스의 필드와 관련된 작업에 사용될 목적으로 선언
2.정적내부 클래스
외부 클래스의 클래스변수와 같이 static키워드를 부여
3.지역내부클래스
외부클래스의 메서드 내부에서 선언하여 사용
메서드 영억에서 선언되기 때문에 메서드 내부에서만 사용 가능
바로 예시를 보자(인스턴스 클래스 )
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 CalculatorExample { public static void main(String[] args) { Calculator cal = new Calculator(10, 11); Calculator.Calc c =cal.new Calc(); System.out.println("합 : "+c.add()); } } |
Calculator 클래스에서 값을 두개 받아준다. 그후 매개변수 생성자를 만들어줘서 값을 넣어준다. Calc클래스를 만들어서 그안에 add 매서드를 만들어준다. main을 만들어주는데 여기가 가장중요하다. Calculator 객체만들어주고 매개변수에는 10과11을 넣어준다. 그후 Calculator 클래스 안에있는 Calc클래스를 불러와야하는데 방법이 독특했다. Calculator.Calc c =cal.new Calc(); 를 해주는데 이것의 의미를 보자 cal은 현재 Calculator매개변수에 10,11넣어 새로운 객체가 바로 cal 인것이다. 그리고 c.acc를 해주면 두 수의 합이 나오게 된다. |
바로 예시를 보자( 정적내부 클래스 )
class PrintOut{ private int val = 1; private static int count =1; public static class Out{ public void println() { System.out.println(count); } } } public class StaticClassExample { public static void main(String[] args) { PrintOut.Out out = new PrintOut.Out(); out.println(); } } |
static 클래스인 PrintOut클래스는 val 변수와 static변수count와 println메서드를 만들어주었다. 그후에 main에서 Out객체를 만들어주는데 방식이 독특하다. PrintOut.Out out = new PrintOut.Out(); 외부 클래스의 인스턴스를 생성할 필요없이 정적 중첩클래스 의 인스턴스를 직접 생성가능하다. 그 이유는 바로 static을 사용했기때문이다. |
바로 예시를 보자( 지역내부클래스 )
public class LocalClassExample { private int speed = 10; public void getUnit(String unitName) { class Unit{ public void move() { System.out.println(unitName + "이 "+ speed +" 속도로 이동합니다."); } } Unit unit = new Unit(); unit.move(); } public static void main(String[] args) { LocalClassExample local = new LocalClassExample(); local.getUnit("마린"); } } |
LocalClassExample 클래스 안에는 private int speed = 10 변수와 getUnit매개변수 메서드가 있는데 메서드안에 새로운 클래스가 있다. 즉 여기서 알수있는점은 getUnit가 실행되어야 그 안에있는 클래스가 실행될수있다는점이다. 내용을 보자 클래스 Unit은 move()메서드를 가지고있는데 출력문이있다. 그후에 Unit클래스 내에서 객체생성하고 메서드에 접근해 실행한다. main은 LocalClassExample 객체만들어주고 local.getUnit("마린"); 해줌으로써 unitName안에 마린이 들어가게된다. |
'(혼) (공) (자)' 카테고리의 다른 글
예외처리 (0) | 2024.01.22 |
---|---|
익명클래스 (1) | 2024.01.22 |
인터페이스-1 (0) | 2024.01.22 |
인터페이스 (0) | 2024.01.17 |
Class - 추상화/추상메서드 (0) | 2024.01.17 |