Do You Coding?
[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};
위의 배열 선언에서 세 방식은 동일하다. 숏코딩 및 리팩토링을 위해 다 알아두도록 하자.
