dev_dbdb1114

[JAVA] inner클래스 (정적 / 비정적) 본문

프로그래밍/JAVA

[JAVA] inner클래스 (정적 / 비정적)

dbdb1114 2022. 12. 2. 23:05

inner 클래스도 두 가지로 분류할 수 있다. 

 

statice 이너클래스 / 이너클래스 

 

원래 보던 것과 조금 달라 보이지만, 잘 생각해보면 크게 다를 것 없다. 

 

  1. 클래스를 왜 만들었지? 부터 생각해본다. 
  2. 클래스를 만드는 이유는 틀을 생성하는 것이다. 
  3. 그 틀이 프로그래밍으로 들어오면 type이 된다. 

class를 선언하는 것 == 개발자가 원하는 타입을 만드는것. 

해당 클래스에 해당하는 객체를 생성하는 것 = 원하는 타입의 무언가를 만드는 것.

그래서 우리가 어떤 객체를 선언할 때 타입 자리에 클래스 명을 넣는 것 아닐까

Car 타입 객체 / Animal 타입 객체 등등.. 

 

자 그럼 그 다음에 static은 뭐였지?? 

static은 정적인 / 고정의 이런 뜻들이 있다. 

나도 궁금해서 static에 대해서 공부를 좀 해볼 예정이지만, 간단하게 알고있는 내용은

 

static 멤버들은 프로그램의 실행과 동시에 메모리에 올라간다는 것이다. 

그래서 객체가 생성되기 전부터 이미 존재하고 있고, 객체는 그들(static멤버)을 공유하고 있다.

 

그 외의 인스턴스 멤버들 ( static이 붙지 않은 것들 )은 해당 클래스의 객체가 생성될 때

메모리에 올라간다. 그리고 객체가 2개면 해당 멤버들도 객체마다 하나씩 가지고 있다.

 

나중에 static에 대해 공부흔적을 남길건데 그 때 링크를 타고 들어와주길 바란다.
아직 아니다 ( 게시글만 만들어놓고 내용은 없다. 해당 내용을 채우면 난 이 메세지를 지울거다. )

2022.11.28 - [JAVA공부] - [JAVA] static이 뭐지

 

[JAVA] static이 뭐지

간단히 말하면, static이 붙어있으면, 해당 클래스로 만드는 모든 객체가 공유한다는 것이다. static이 붙은 필드는 클래스가 만들어지면서 바로 생성되는 것이다. static이 붙지 않은 필드는 객체가

dev-dbdb1114.tistory.com

 

어쨌든 그렇다면, 내부 클래스를 static으로 선언하고 non-static으로 선언하고의 차이는 뭘까 

 

간단하게 생각하면,

해당 클래스를 공유하는 것이 효율적이라면 static으로 선언하고, 

해당 클래스를 각각의 객체들이 사용해야한다면 non-static으로 선언할 것이다. 

 

그래서 보통 정적 이너클래스의 경우 private 액세스 지정자를 사용한다.

왜냐하면 어차피 모두 공유되어 내부에서만 사용할 것이기 때문이다. 

해당 코드가 아래와 같다. 

class Car {
	CarName name;
	String color;
	
	Car (String aModel, int aYear, String aColor){
		name = new CarName(aModel, aYear);
		color = aColor;
	}
	
	static private class CarName{
		String model;
		int year;
		
		CarName(String aModel, int aYear){
			model = aModel;
			year = aYear;
		}
	}
	
	public void printCarInform () {
		System.out.println(name.model );
		System.out.println(name.year );
		System.out.println(color );
	}
}

public class Date01 {
	public static void main(String[] args) {
		Car pride = new Car("프라이드", 2005, "파랑");
		pride.printCarInform();
	}
	
}

해당 경우에 Car라는 객체의 모델과 연식을 내부 클래스로 선언하여서 해당 타입의 변수를 미리 만들어 놓고, 생성자를 통해 바로 객체를 생성할 수 있게끔 하였다. 이렇게 생각해보면 Car라는 하나의 클래스 안에 100가지의 속성이 들어간다고 했을 때 해당 필드를 모두 선언하는 것이 아니라 분류하여 class별로 묶어서 선언해줄 수 있는 이점이 생긴다. 

 

반대로 비정적 innerClass의 경우는 어떨까? 
일단 선언 방식은 당연히 정적 이너 클래스에서 static을 뗀 것이다. 코드로 살펴보자면, 

정적 이너클래스 두 개와 비정적 이너클래스 한 가지를 두었는데, 개인적인 생각으로 비정적 이너클래스라고 한다면,

사용법에 대해서는 사실 의문이 많이 든다. 일단 그것은 차치하고, static 내부클래스는 private으로 많이 선언한다는 사실을 배웠으니

private이 아닌 바로바로 불러올 수 있는 클래스로 선언을 해두었다. 대신 비정적 클래스는 객체 생성 방식이 좀 독특하다. 

맨 아래에 나온 것처럼 Car.클래스명 객체명 = Car타입 객체.new 클래스명() 이런 식으로 사용한다. 

class Car {
	CarName name;
	CarSpec spec;
	PrintCarInfo carInfo;
	String color;
	
	Car (String aModel, int aYear, String aColor, int km, int cc){
		name = new CarName(aModel, aYear);
		spec = new CarSpec(km,cc);
		carInfo = new PrintCarInfo();
		color = aColor;
	}
	
	static private class CarName{
		String model;
		int year;
		
		CarName(String aModel, int aYear){
			model = aModel;
			year = aYear;
		}
	}

	static private class CarSpec{
		int km;
		int cc;
		
		CarSpec(int km, int cc){
			this.km = km;
			this.cc = cc;
		}
	}
	
	class PrintCarInfo {		
		
		public void printCarName () {
			System.out.println(name.model );
			System.out.println(name.year );
		}
		
		public void printCarSpec () {
			System.out.println(spec.cc);
			System.out.println(spec.km);
		}
		
		
	}
	
}

public class Date01 {
	public static void main(String[] args) {
		Car pride = new Car("프라이드", 2005, "파랑",120,2000);
		pride.carInfo.printCarName();
		pride.carInfo.printCarSpec();
        
        Car.PrintCarInfo carInfo = pride.new PrintCarInfo();
	}
	
}

 

아래는 내가 비정적 클래스와 정적 클래스의 차이를 좀 더 깊이있게 알고싶어서 방문한 블로그이다.

비전공자인 내게 어렵지만 같이 본다면 좀 유의미하겠다 싶어서 가져왔다. 

https://tecoble.techcourse.co.kr/post/2020-11-05-nested-class/

'프로그래밍 > JAVA' 카테고리의 다른 글

[JAVA] 가비지컬렉터2 - 동작방식  (0) 2022.12.08
[JAVA] 가비지컬렉터 - Heap 영역  (0) 2022.12.08
[JAVA] static이 뭐지  (0) 2022.11.28
[JAVA] 생성자에 관한 이야기1  (0) 2022.11.28
[JAVA] 액세스 지정자  (0) 2022.11.28
Comments