재밌고 어려운 IT를 이해해보자~!
내부클래스 본문
내부클래스란!
내부클래스의 명칭은 3가지가 있고 각각 선언부위치가 다르다.
Instance class : 외부 클래스의 맴버변수 선언위치, 외부 클래스의 인스턴스 맴버처럼 다루어진다.
주로 외부 클래스의 인스턴스맴버들과 관련된 작업에 사용목적.
Static class: 외부 클래스의 맴버변수 위치, 외부 크래스의 static 맴버처럼 다루어지며 static 멤버, static메서드에 사용할
목적으로 쓰임.
local calss: 외부클래스의 메서드나 초기화블럭 안에 선언. 선언된 내부에서만 사용.
메서드내부나 클래스 내부에 있는 클래스를 의미한다. -> 이걸 지역클래스라고 부르는 것 같다.
클래스가 메서드 내부에 있으면 메서드가 호출될때 같이 호출되고 끝나면 같이 사라진다.
메서드 내부 클래스는 부여된 객체만 사용가능한 장점이 있다 .
지역 클래스(내부클래스)에서 메서드 내의 변수를 사용하려면 해당변수는 final 이어야한다.
자바에서 지역 메서드를 사용할때 파라미터 변수를 바꾸지 않는다면 자동으로 final로 인정.
예를들어
public void getunit(String type,String unitnmae) {
} 일때
이후에 unitname = unitname + "님" ; 을 선언하면 final이 아니게 된다.
*Objcect 키워드는 객체의 타입 최상위 키워드이다.
내부클래스 객체화 표기
//외부 클래스 객체화
Calculator cal = new Calculator(12, 20);
//내부 클래스 객체화
Calculator.Calc calc = cal.new Calc(); //내부클래스 객체화 .
정적내부클래스!
정적 내부 클래스란
내부클래스도 정적으로 선언할 수 있으며 주로 외부 클래스의 static 메서드에서 사용될 목적으로 선언된다.
정적 메서드 또는 클래스는 내부에서 맴버변수 또는 인스턴스호출이 불가능하다.
그이유는 메모리에 올라가는 시점이 다르고 static이 먼저올라가고 객체화가 필요한 애들은 내부에서 사용할 수없다.
스테틱이 잇는 곳에서 스테틱이 아닌 필드는 사용할 수 없다.
package exam12.st;
public class PrintOut {
public static class Out{ //정적 내부 클래스 -> 외부 클래스를 객체화 하지않고 쓸수있다!!!!!!!!
public void println(String str) {
System.out.println(str);
}
}
public static void main(String[] args) {
//PrintOut out2 = new PrintOut();
//PrintOut.Out out= out2.new Out(); 내부 static 클래스가 아니면 이 두줄로 객체화 해야하지만
// static 을 사용하면 다음처럼 내부클래스만 객체화 하면 된다. 외부클래스 객체회 필요 X
Out out = new Out();
String str = "정적 내부클래스";
out.println(str);
//* 내부 클래스는 Public으로 두는것이 좋은 편이다 Private 으로 지정햇을때 외부에서 접근하기가 매우매우매우 어렵다.
}
}
정적내부클래스를쓰면 내부클래스를 일반(외부)클래스와 동일하게 객체화해서 사용할 수 있다.