Java - 기본기

16. 객체 배열, 클래스의 정의

TerianP 2021. 10. 22.
728x90

1. 객체 배열

  • 우선 기억해야하는 것은 배열의 0번째 인덱스의 주소값과 배열 자체의 시작 주소값은 동일!!! 하다는 것
int[] array = new int[3];
		for(int i=0; i<array.length; i++) {
			array[i] = i;
		}

일 때 array 배열의 시작 주소값은 '[I@282ba1e' 로 동일하게 출력된다.
  • 객체의 배열이란 참조 변수의 배열이라고 생각하면 됨
  • 즉 객체 배열 == 참조변수 배열
  • 즉 기존에는 배열에 단순히 변수를 넣어서 계산한다거나 했지만 객체 배열을 사용하면, 클래스를 통해 생성된 객체를 배열(참조변수를 배열)로 묶어서 활용할 수 있다는 장점이 있다.
// 객체를 3개 생성
TV tv1 = new TV();
TV tv2 = new TV();
TV tv3 = new TV();
		
// 객체를 배열로 활용하려면 요렇게!
TV[] tvArr = new TV[3];

// 객체를 생성해서 배열의 각 요소에 저장
tvArr[0] = new TV();
tvArr[1] = new TV();
tvArr[2] = new TV();

// 위의 내용은 즉 아래 처럼 생각하면 된다
tvArr 라는 배열 객체가 0x100 의 주소값을 갖을 때, 배열의 요소는 각각 아래의 주소값을 갖는다.
tvArr[0] = 0x100
tvArr[1] = 0x200
tvArr[2] = 0x300

 

2. 클래스의 정의

  • 클래스 == 데이터 + 함수
  • 일종의 설계도이자 데이터와 함수의 결합!!(변수 + 메서드)
  • 동시에 사용자 정의 타입 이라고 이야기 할 수 있다.

2-1. 클래스에 대해 설명하기 전 '데이터' 의 발전 과정에 대해서 생각해봐야 한다.

  1. 변수 : 하나의 데이터를 저장할 수 있는 공간
  2. 배열 : 같은 종류(동일한 타입)!!! 의 여러 데이터를 하나로 저장 할 수 있는 공간
  3. 구조체 : 서로 관련된 여러 데이터(종류 관계X, 동일한 타입 유무 상관X)를 하나로 저장 할 수 있는 공간(C 언어에서 등장)
  4. 클래스 : 데이터와 함수의 결합(구조체 + 메서드) ⇒ 클래스에서 함수까지 포함된 것은 어찌보면 당연한 것이다. 왜냐하면 기존 구조체만 갖고 있다면 결국 구조체 안의 데이터를 사용해서 계산하거나 활용하는 부분들은 수동으로 다시 짜 줘야 할 것이다. 그러나 클래스를 통해서 비슷한 작업을 해주는 메서드까지 묶어두면 작업 할 때마다 활용하는 영역! 즉, 메서드 부분을 다시 짜야 할 필요가 없이 그대로 사용 가능하다는 어마어마한 장점이 있다.

-> 나처럼 귀차니즘 레벨이 만땅이 사람이라면 너무나도 고마운 기능이다.

 

2-2. 사용자 정의 타입이란?

  • 클래스를 통해서 사용자 자신이 원하는 타입을 직접 만들 수 있다(여기서 타입==클래스 라고 생각하면 됨)
  • 자바에서는 기본으로 제공되는 굉장히 많은 패키지와 그 안에 있는 클래스들이 있지만, 결국 내가 찾는 것이 없는 경우도 많다.
  • 예를 들어 내가 멀티플레이 게임을 만들려고 할 때 게임 안에서 캐릭터를 생성하면 사람의 캐릭터 닉네임과 레벨 움직임이 있어야 한다.
String name = "젤다";
int Lv = "1";
String move = "점프";
  • 근데 내가 만들려고하는 것은 멀티 플레이 게임이다. 그려면 결국 내 친구들인 A 와 B C 모두 각자마다 캐릭터의 이름, 레벨, 움직임이 필요하다. 이때 단순히 변수로만 해당 내용들을 지정해주려면 끝도 없이 많이 지정해야 한다.
String name = "젤다";
int Lv = "1";
String move = "높이 높이 점프!!";

String name2 = "링크";
int Lv2 = "2";
String move2 = "슈슈슉 회피기동!!";

String name = "마리오";
int Lv = "3";
String move = "스카이 소드를 휘두른다!";
  • 위에서 정의된 내용을 배열로 묶으려면 아래처럼 해서 for 문으로 돌리고 해서 넣어야 하는데 결국에는 name 은 name 끼리 Lv 는 Lv 끼리 묶여야한다는 단점이 있다.
String[] name = new String[3];
int[] Lv = new int[3];
String[] move = new String[3];
  • 클래스를 안쓰면 위와 같이 코드가 끝도 없이 복잡해질 수 밖에 없다. 단순히 4명을 작업하는데도 이런데 이렇게 만들어야하는게 100개면? 1000개면? 너무나 많은 시간과 힘이 들어간다.
  • 즉 클래스는 변수나 메서드를 계속해서 새로 생성하고 활용하는 과정을 줄이기 위해 나왔다고 생각하면 된다. 위의 복잡한 생성 과정을 클래스를 통해 객체를 생성하면 훨씬 쉽고 간단하게 바꿀 수 있다.
// 게임 클래스 생성
class Game{
	String name;
	int Lv;
	String move;
}

public static void main(String[] args){

Game game_na = new Game();
game_na.name = "젤다";
game_na.Lv = 1;
game_na.move = "높이 높이 점프!!";
		
Game game_A = new Game();
game_A.name = "링크";
game_A.Lv = 2;
game_A.move = "슈슈슉 회피기동!!";
		
Game game_B = new Game();
game_B.name = "젤다";
game_B.Lv = 3;
game_B.move = "스카이 소드를 휘두른다!";


// 이렇게 작성해두면 na(나) 의 게임 정보와 A의 게임 정보, B 의 게임 정보를 각각 자신에게 맞게 저장 가능하다.
// 이를 배열로 바꾸어 저장하면 결국 gm 객체 배열의 0 번째에 game_na 로 저장한 정보가, 1에는 A로 저장한 정보가 2에는 B로 저장한 정보가 담기게 된다.
Game[] gm = new Game[3];
gm[0] = game_na;
gm[1] = game_A;
gm[2] = game_B;


// 출력
System.out.println("LV "+gm[0].Lv+ " "+gm[0].name+" 가 "+gm[0].move);
}


// 결과
LV 1 젤다 가 높이 높이 점프!!

 

댓글