거북이처럼 천천히

Java - 클래스 정리 (3) 본문

Back-end/Java 개념

Java - 클래스 정리 (3)

유로 청년 2022. 6. 27. 02:53
package Chapter2;

public class Code01 {
	public static void main(String[] args) {
		PersonInfo person1 = new PersonInfo();
		
		person1.name = "Chirs";
		person1.phoneNumber = "010-1234-5678";
		
		System.out.printf("Before => name: %s, phone: %s \n", person1.name, person1.phoneNumber);
		
		PersonInfo person2 = person1;
		
		person1.name = "David";
		
		System.out.printf("After => name: %s, phone: %s \n", person2.name, person2.phoneNumber);
	}
}
  • PersonInfo (사용자 정의) 타입의 person1 객체는 이름은 "Chris", 전화번호는 "010-1234-5678" 데이터를 담고 있는 이름없는 객체의 주소(참조) 정보를 담고 있다.
  • 이번에는 새로운 PersonInfo (사용자 정의) 타입의 person2 객체를 생성하고, 대입 연산자와 함께 PersonInfo person2 = person1 이라고 작성하였다.
  • PersonInfo person2 = person1 → person1 객체가 가르키고 있는 주소(참조) 정보를 person2 객체에 복사 붙어넣기
  • 따라서 person2 또한 이름은 "Chris", 전화번호는 "010-1234-5678" 데이터를 담고 있는 이름없는 객체를 가르키고 있어 person2를 통해서도 데이터에 접근 및 수정이 가능하다.

package Chapter2;

public class Code01 {
	public static void main(String[] args) {
		PersonInfo person1 = new PersonInfo();
		
		person1.name = "Chirs";
		person1.phoneNumber = "010-1234-5678";		
		
		PersonInfo person2 = person1;	

		PersonInfo[] people = new PersonInfo[100];
		people[0] = person1;
		people[1] = person2;
		System.out.printf("name: %s, phone: %s \n", people[0].name, people[0].phoneNumber);
		System.out.printf("name: %s, phone: %s \n", people[1].name, people[1].phoneNumber);				
	}
}
  • PersonInfo 타입으로 100개의 사이즈를 갖는 people 객체 배열을 생성하였다.
  • people 배열의 각각의 원소들도 PersonInfo 타입인 동시에 데이터를 담고 있는 것이 아닌 이름과 전화번호를 갖고 있는 객체의 주소(참조)를 갖고있다.
  • 따라서 각각의 원소들은 주소(참조) 정보를 갖고 있는 것이다. (= 각각의 원소들은 참조 변수가 된다.)

배열 생성 분석 (Primitive 타입 배열)

int형 배열을 생성하는 방법은 다음과 같다.

int[] numbers = new int[8];

 

위 코드를 분석해보자.

  • 먼저, int형 배열인 int[ ]은 primitive 타입이 아니다. 
  • 따라서 numbers 변수는 정수형 배열로, primitive 타입이 아니기 때문에 참조 변수이다. 
    즉, numbers 자체가 배열이 아니라 배열의 주소를 저장하는 참조 변수이다.
  • new int[8] 은 new 명령어에 의해서 생성된 배열 형태의 객체이다.
  • 그리고, numbers는 배열의 시작점의 주소를 저장하고 있는 참조 변수이다.
  • 배열의 각각의 원소들은 정수형 변수(int형 변수), primitive 타입 변수인 것이다. 


배열 생성 분석 (사용자 정의 타입 배열)

이번에는 아래와 같이 코드를 작성해 보았다.

public class Code01 {
	public static void main(String[] args) {
		PersonInfo person1 = new PersonInfo();
		person1.name = "Chris";
		person1.phoneNumber = "010-1234-5678";
		
		PersonInfo[] people = new PersonInfo[100];
		people[0] = person1;
		
		System.out.printf("peron1, name: %s, phoneNumber: %s\n", people[0].name, people[0].phoneNumber);
		
		people[1].name = "David";
		people[1].phoneNumber = "011-7895-1452";
		
		System.out.printf("peron2, name: %s, phoneNumber: %s\n", people[1].name, people[1].phoneNumber);
	}
}

 

위 코드를 분석하면

  • PersonInfo 타입의 배열을 생성하여 people이라는 객체명을 정했다. 사이즈 100이다.
  • 그리고, 첫 번째 원소에 person1 참조 변수를 복사하였다.
  • 두 번째 원소의 name과 phoneNumber를 각각 David, 011-7895-1452이라고 수정하였다.
  • 하지만, people[1].name과 people[1].phoneNumber에서 오류가 발생하였다. 

 

무엇이 문제인가?

  • people 객체는 PersonInfo 타입이며, 배열 형태의 객체이다.
  • people 객체는 PersonInfo 타입의 배열 주소(참조)를 담고 있으며, 배열 원소들 또한 PersonInfo 타입이기 때문에 객체의 주소(참조)를 담고 있다.
  • 그런데, 두 번째 원소는 아직 객체가 생성되지 않은 상태이기 때문에 null 값이 들어가 있다.
  • 그런 상태에서 name과 phoneNumber를 수정하려고 하니까 오류가 발생한 것이다. 

 

그럼 해결책은 무엇인가?

  • 두 번째 원소는 아직 객체가 생성되지 않은 상태이기 때문에 new 명령어를 이용하여 객체를 생성한다.
  • 그 다음에 name과 phoneNumber를 수정하자.

 

public class Code01 {
	public static void main(String[] args) {
		PersonInfo person1 = new PersonInfo();
		person1.name = "Chris";
		person1.phoneNumber = "010-1234-5678";
		
		PersonInfo[] people = new PersonInfo[100];
		people[0] = person1;
		
		System.out.printf("peron1, name: %s, phoneNumber: %s\n", people[0].name, people[0].phoneNumber);
		
		people[1] = new PersonInfo();
		people[1].name = "David";
		people[1].phoneNumber = "011-7895-1452";
		
		System.out.printf("peron2, name: %s, phoneNumber: %s\n", people[1].name, people[1].phoneNumber);
	}
}
peron1, name: Chris, phoneNumber: 010-1234-5678
peron2, name: David, phoneNumber: 011-7895-1452

 

Reference

  • Java로 배우는 자료 구조, 권오흠

'Back-end > Java 개념' 카테고리의 다른 글

Java - 메서드와 생성자(2)  (0) 2022.06.30
Java - 클래스 정리 (4)  (0) 2022.06.27
Java - 클래스 정리 (2)  (0) 2022.06.26
Java - 클래스 정리 (1)  (0) 2022.06.26
Java - 변수 선언 위치에 따른 변수 구분  (0) 2022.06.26