Do You Coding?

[Java] 1. 클래스 (class) 본문

Backend/Java

[Java] 1. 클래스 (class)

클래스의 필요성

Java는 클래스와 객체로 이루어져 있어서, 클래스는 가장 중요한 개념 중 하나이다.

추후에 다룰 객체지향 프로그래밍(OOP)의 핵심이기도 하다.

클래스라는 것은 무엇이며, 왜 필요할까?

 

1. 객체를 만들기 위한 설계도

- 클래스는 현실 세계에서 어떠한 개념(사람, 자동차, 계좌 등)을 코드로 표현하는 설계도이다.

클래스라는 설계도를 기반으로 실제 사용할 수 있는 객체(object) (또는 인스턴스) 를 만들게 되는 것이다.

ex) Car 클래스 생성 -> 이를 통해 myCar, yourCar 같은 객체들이 생성될 수 있다.

 

2. 데이터와 기능을 묶을 수 있음

- 클래스속성(변수)행동(매서드)을 하나로 묶어준다.

ex) Student 클래스 -> { 이름(속성) / 나이(속성) / 공부하다() (행동) / 자다() (행동) } 을 하나로 묶음.

 

3. 코드 재사용 용이

- 한번 클래스를 만들어두면 여러번 재사용할 수 있다.

유지보수에도 쉽고 좋으며, 비슷한 구조의 코드를 줄여서 쓸 수 있다.

 

4. 캡슐화 가능

- 데이터를 외부로부터 보호할 수 있도록,

필드를 private로 선언하여 매서드를 통해서 접근케 하면 값변경을 보호할 수 있다.


클래스 만들기

예시로 Student 라는 학생 정보를 담고있는 클래스를 만들어보도록 하겠다.

 

0. 클래스 정의

package practice;

public class Student {
    String name;
    int age;
    int grade;
}

 

class 키워드를 사용해서 학생 클래스를 정의한다.

내부에는 이름, 나이, 성적에 대한 정보를 담을 수 있도록 구성한다.

 

1. 변수 선언

Student student1;

 

Student 타입을 받을 수 있는 변수인 student1을 선언한다.

int는 정수를, String은 문자를, Student는 Student타입 객체를 받을 수 있게 된다.

 

2. 객체 생성

student1 = new Student();

 

어떠한 객체를 사용하기 위해서는 먼저 설계도인 클래스를 기반으로 객체를 생성해야하는데,

생성하기 위해서는 new라는 키워드를 이용하여, new 클래스명() 을 작성하면 된다.

new는 새로 생성한다는 뜻으로, Student 클래스 정보를 기반으로 새 객체를 생성하라는 뜻이 된다.

이렇게 하면 메모리에 실제 Student 객체가 생성된다.

 

3. 참조값 보관

new 키워드를 통해 객체를 생성하면 메모리 어딘가에 있는 이 객체에 접근할 수 있는 참조값(주소)이 반환되며,

student1 변수에 이 참조값이 보관된다.

 

new Student() 코드만 있으면, 이 생성된 객체 접근할 수 있는 방법이 없다.

따라서 new로 객체 생성시 반환되는 참조값을 어딘가 보관해두고 이를 통해 객체에 접근해야하므로,

student1이라는 변수에 이를 저장하게 되는 것이다.

 

참조값을 확인하는 방법)

System.out.println(student1);
System.out.println(student2);
//출력결과
practice.Student@11c20519
practice.Student@70beb599

 

@ 앞의 내용은 패키지와 클래스 정보이며, @ 뒤는 16진수로 된 참조값이다.


객체 사용

- 객체에 값 대입

객체가 가지고 있는 멤버 변수인 name, age 등에 어떤 값을 대입하려면, 객체에 먼저 접근을 해야한다.

이를 위해 ' . ' (점) 키워드를 사용하고, 변수에 들어있는 참조값을 읽어 메모리에 존재하는 객체에 접근한다.

student1.name = "두유";

 

라는 코드가 작성 되면, 내부적으로 . 키워드에 의해 student1 객체의 name 멤버 변수에 접근한다.

student1 변수에 practice.Student@11c20519 와 같은 참조값을 가지고 있고, 이 위치의 객체에 접근하여

해당 객체의 name 멤버 변수 값을 '두유'로 대입하게 되는 것이다.

 

- 객체의 값 읽기

System.out.println("이름" + student1.name);

 

위처럼 . 키워드를 이용해서 값을 읽어와 출력에 사용할 수도 있다.


클래스 / 객체 / 인스턴스

- 클래스 : 객체를 생성하기 위한 설계도. 객체가 가져야 할 속성(변수)과 기능(매서드)을 정의한다.

- 객체 : 클래스에서 정의한 속성과 기능을 가진 실체. 같은 클래스에서 만들어져도 서로 다른 객체이다.

- 인스턴스 : 특정 클래스로부터 생성된 객체. 어떤 특정 클래스에 속해있는지를 강조하기 위한 용어이며,

"student1 객체는 Student 클래스의 인스턴스" 라고 표현할 수 있다.

(클래스에서 나온 실체라는 점에서 객체와 인스턴스의 핵심 의미가 동일하므로 구분하지않고 사용한다.)


클래스에 배열 도입

package practice;

public class classStart {
	public static void main(String[] args)
	{
		Student student1 = new Student();
		student1.name = "students1";
		student1.age = 15;
		student1.grade = 92;
		
		Student student2 = new Student();
		student2.name = "students2";
		student2.age = 11;
		student2.grade = 93;
		
		Student[] students = new Student[2];
		students[0] = student1;
		students[1] = student2;
	}
}

 

Student 클래스로 student1, student2 인스턴스를 생성했고,

이를 Student[] students 배열에 넣어주는 과정의 코드이다.

 

배열의 생성 방법은 자료형[] 이름 = new 자료형[크기]; 과 같이 사용하는데,

자료형 부분에 클래스명을 적으면 해당 클래스의 변수를 보관할 수 있는 배열이 만들어진다.

 

그리고 현재 student1과 student2에는 참조값이 보관되어있으므로,

이 참조값을 students[0]과 students[1]에 각각 복사하여 대입해준다. (인스턴스 자체를 복사 x, 참조값만 복사o)

** 자바에서 대입은 항상 변수에 들어있는 값만 복사해서 전달한다. **

 

따라서, student1이 가리키는 객체에 접근하기 위해서는,

student1 또는 students[0] 을 통해 접근할 수 있다. (같은 참조값이 저장되어있음.)

 

System.out.println(students[0].name + student1.age);
System.out.println(students[1].name + student2.age);

 

배열에 들어있는 객체를 사용하기 위해서 기존처럼 '.' 키워드를 사용하면 된다.

 

+) 추가 리팩토링

Student[] students = new Student[2]; students[0] = student1; students[1] = student2;

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

Student[] students = {student1, student2};

 

위의 배열 선언에서 세 방식은 동일하다. 숏코딩 및 리팩토링을 위해 다 알아두도록 하자.