자바 클래스(Class) - 2

계리·2024년 1월 31일
0

객체 사용

객체를 사용하려면 메모리에 존재하는 객체에 접근해야 한다. 앞서 얘기했듯이 객체가 보관하고 있는 참조 값으로 접근해서 사용한다.

사용 방법은 .(점, dot)을 이용해서 사용하면 된다.

//객체 값 대입
student1.name = "학생1";
student1.age = 15;
student1.grade = 90;

//객체 값 사용
System.out.println("이름:" + student1.name + " 나이:" + student1.age + " 성적:" +
student1.grade);


객체에 값 대입

객체에 값 대입을 하기 위해서는 해당 객체에 접근을 해야한다. 접근하기 위해서 해당 객체가 보관하고 있는 참조 값으로 접근을 한다. student1 변수가 보관하고 있는 참조 값(ㅌ001)을 읽어서 메모리에 존재하는 객체에 접근한다.

객체에 값 대입 하는 법은 위에 코드처럼 .(점, dot) 키워드를 사용하면 된다.

순서를 간단하게 풀어보면

student1.name = "학생1"; // 1. student1 객체의 name 멤버 변수에 값 대입
x001.name = "학생1"; // 2. 변수에 있는 참조 값을 통해 실제 객체에 접근, 해당 객체의 name 멤버 변수에 값 대입

student1.name = "학생1" 코드 실행 전

student1.name = "학생1" 코드 실행 후


객체 값 읽기

값 읽는 접근 방법과 순서는 위 객체 값 대입하는 그림과 똑같다.

//1. 객체 값 읽기
System.out.println("이름:" + student1.name);
//2. 변수에 있는 참조값을 통해 실제 객체에 접근하고, name 멤버 변수에 접근한다.
System.out.println("이름:" + x001.name);
//3. 객체의 멤버 변수의 값을 읽어옴
System.out.println("이름:" + "학생1")


객체 배열

클래스와 객체를 이용해서 데이터를 구조적으로 이해하기 쉽게 변경했다. 하지만 앞선 자바 클래스(Class) - 1 에서 코드를 보면 출력 부분이 좀 아쉬운 부분이다.

출력 부분을 객체 배열을 통해 바꿔보도록 한다.

배열은 특정 타입을 연속적인 데이터 구조로 묶어서 관리를 할 수 있게 해준다.
int형, char형, String형 등등 그런데 객체도 똑같이 관리해줄 수 있다. 객체도 타입이 있기 때문에 가능하다. 자바 클래스(Class) - 1 에서 설명했을 때 Student 타입의 객체를 선언한다고 얘기했었다. 그러면 Student 타입을 사용하는 배열도 만들어보자.

package class1;

public class ClassStart4 {

	public static void main(String[] args) {
		Student student1;
		student1 = new Student();
		student1.name = "학생1";
		student1.age = 15;
		student1.grade = 90;
		
		Student student2 = new Student();
		student2.name = "학생2";
		student2.age = 16;
		student2.grade = 80;
		
		Student[] students = new Student[2];
		
		students[0] = student1;
		students[1] = student2;
		
		System.out.println("이름 : " + students[0].name + " 나이 = " + students[0].age + " 성적 = " + students[0].grade);
		System.out.println("이름 : " + students[1].name + " 나이 = " + students[1].age + " 성적 = " + students[1].grade);
	}

}

소스분석

Student 타입의 클래스로 2개의 인스턴스를 생성 후 값을 메모리에 채워뒀다.

		Student student1;
		student1 = new Student();
		student1.name = "학생1";
		student1.age = 15;
		student1.grade = 90;
		
		Student student2 = new Student();
		student2.name = "학생2";
		student2.age = 16;
		student2.grade = 80;


배열에 참조 값 대입

Student 타입의 인스턴스를 보관하기 위해 Student 타입의 배열 선언

Student[] students = new Student[2];

  • Student 인스턴스 2개를 보관하기 위해 사이즈 2의 배열을 선언한다.
  • Student 타입의 배열 변수도 마찬가지로 Student 배열 인스턴스의 참조 값을 보관한다.
  • 배열에는 아직 참조 값을 대입하지 않았기 때문에 참조 값이 없다는 의미로 null 값으로 초기화 된다.

배열에 객체 보관하기

		students[0] = student1;
		students[1] = student2;

자바에서 대입은 항상 변수에 들어 있는 값을 복사한다.

이게 가장 핵심적인 말이라고 해서 강조를 표시하기 위해 글씨 크기를 키워봤다.

student1, student2 변수에는 참조 값을 보관하고 있다. 그러므로 이 참조 값이 배열에 저장된다. 또는 student1, student2에 보관된 참조 값을 읽고 복사해서 배열에 대입한다고 표현한다.


배열에 인스턴스 참조 값들을 대입한 후

해당 인스턴스들의 참조 값을 통해서 배열도 접근할 수 있게 됐다.


배열에 인스턴스 참조 값들을 대입한 이후 최종

	students[0] = student1;
	students[1] = student2;
	
    //자바에서 대입은 항상 변수에 들어 있는 값을 복사한다.
	students[0] = x001;
	students[1] = x002;

주의 해야할 점
변수에는 인스턴스 자체가 들어있는 것이 아니라 인스턴스의 위치를 가리키는 참조 값이 들어있을 뿐이기 때문에 인스턴스 자체가 복사되는 것이 아니고 참조 값만 복사된다.


객체 배열을 통해 for문으로 출력

package class1;

public class ClassStart5 {

	public static void main(String[] args) {
		Student student1;
		student1 = new Student();
		student1.name = "학생1";
		student1.age = 15;
		student1.grade = 90;
		
		Student student2 = new Student();
		student2.name = "학생2";
		student2.age = 16;
		student2.grade = 80;
		
		Student[] students = new Student[] {student1, student2};

		for(int i=0; i<students.length; i++) {
			System.out.println("이름 : " + students[i].name + " 나이 = " + students[i].age + " 성적 = " + students[i].grade);
		}
	}

}

배열 선언

보통 사용하는 int, String 타입과 동일하게 Student 타입도 배열을 생성할 때 포함할 수 있다.

Student[] students = new Student[]{student1, student2};

생성과 선언을 동시에 하는 경우 다음과 같이 더 최적화 할 수 있다.

Student[] students = {student1, student2};

for문 도입

for문을 통해 출력 부분을 반복작업 하지 않고 처리할 수 있다.

for (int i = 0; i < students.length; i++) {
 System.out.println("이름:" + students[i].name + " 나이:" + students[i].age 
+ ...);

Students[i]라고 사용하기 번거롭다면 Student s와 같은 변수에 담아서 사용해도 된다.

		for(int i=0; i<students.length; i++) {
			Student s = students[i];
			System.out.println("이름 : " + s.name + " 나이 = " + s.age + " 성적 = " + s.grade);
		}

바로 위 for문 역할을 해주는 향상된 for문을 사용하면 더욱 더 간결하게 사용할 수 있다.

		for(Student s : students) {
			System.out.println("이름 : " + s.name + " 나이 = " + s.age + " 성적 = " + s.grade);
		}

참고

  • 김영한의 실전 자바 기본편
profile
gyery

0개의 댓글