클래스
필드와 메소드로 구성되어 객체를 정의하는 역할
자바에서 클래스란 객체를 정의하는 틀, 설계도와 같은 의미로 사용된다.
이 틀을 가지고, 객체를 생성하여 사용한다.
클래스는 객체의 상태를 나타내는 필드, 객체의 행동을 나타내는 메소드로 구성된다.
필드는 객체에 포함되어 있는 변수를, 메소드는 함수와 같이 특정 작업을 수행하기 위해서 사용하는 집합체라고 할 수 있다
클래스가 필요한 이유?
먼저 다음 예시를 살펴보자.
3개의 변수를 활용해서 간단히 학생의 정보를 입력하고, 이를 출력하는 코드이다.
학생마다 다른 변수를 사용해야하기 때문에, 학생이 늘어날때마다 계속해서 서로 다른 3개의 변수를 추가해주어야 한다.
public static void main(String[] args) {
String student1Name = "학생1";
int student1Age = 15;
int student1Grade = 90;
String student2Name = "학생2";
int student2Age = 16;
int student2Grade = 80;
System.out.println("이름 : " + student1Name + ", 나이 : " + student1Age + ", 성적 : " + student1Grade);
System.out.println("이름 : " + student2Name + ", 나이 : " + student2Age + ", 성적 : " + student2Grade);
}
이를 개선해보기 위해서 배열을 사용해본다.
public static void main(String[] args) {
String[] studentNames = {"학생1", "학생2", "학생3"};
int[] studentAges = {15, 16, 17};
int[] studentGrades = {90, 80, 70};
for (int i = 0; i < studentNames.length; i++) {
System.out.println("이름 : " + studentNames[i] + ", 나이 : " + studentAges[i] + ", 성적 : " + studentGrades[i]);
}
}
배열을 활용하여 학생이 추가될때마다 새로운 변수를 추가하는 게 아니라, 배열의 사이즈를 늘려 값을 추가하면 된다.
코드 변경을 최소한으로 줄일 수 있는 장점이 있다.
하지만 개발자가 실수로 이 순서를 다르게 가져온다면? 학생의 정보를 잘못 불러오는 문제를 일으킬 수 있다.
개발자가 관리하기 좋은 코드라고 할 수 없다.
학생을 표현하는 name, age, grade를 묶어 클래스로 만들어주면, 문제를 해결할 수 있다.
<Student 클래스>
public class Student {
String name;
int age;
int grade;
}
public static void main(String[] args) {
Student 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 (Student student : students) {
System.out.println("이름 : " + student.name + ", 나이 : " + student.age + ", 성적 : " + student.grade);
}
}
클래스를 사용하면, 이와같이 하나의 그룹으로 묶어서 관리할 수 있는 장점이 있다.
객체의 생성과 사용
클래스를 실제로 사용하기 위해서는 new 연산자를 통해서 생성해주어야한다.
new 연산자를 사용하면 메모리에 실제 Student 객체(인스턴스)를 생성한다.
객체가 생성되면 참조값이 반환되고, 이 참조값을 가지고 접근할 수 있다!
여기 접근하기 위해 이 참조값을 기억해두어야한다( 객체에 접근할 수 있는 주소값 )
student 변수를 통해서 접근하고 사용할 수 있다.

다음과 같이 객체를 생성하면, x001이라는 주소값에 객체가 생성된다.
이 x001에 접근해서 student1의 name, age, grade에도 접근할 수 있다.
클래스와 객체, 인스턴스
클래스와 객체, 인스턴스 용어가 헷갈린다
쉽게 접근해보자
클래스
클래스는 객체를 생성하기 위한 '틀' 혹은 '설계도' 라고 생각할 수 있다.
클래스에는 객체가 가져야 할 속성(변수)과 기능(메서드)를 정의한다.
객체
객체는 클래스에서 정의했던 속성과 기능을 가지고 있는 실체이다.
실체라는 말이 가장 혼란스럽긴했지만, 실제 코드에서 사용되는 부분이라고 생각하는게 가장 좋았다.
Student라는 클래스를 만들어놓고, 이를 코드에서 활용하기 위해서 student1, student2 라는 객체를 생성한다.
클래스는 붕어빵틀, 객체는 붕어빵이라고 보면 편하다.
클래스를 만들어놓고, 이를 사용할때 객체로 생성한다!
인스턴스
클래스에서 또 한번 혼돈을 주는 녀석, 바로 인스턴스이다.
인스턴스란 특정 클래스로부터 생성된 객체를 의미한다. 그래서 객체와 자주 혼용되는 용어이다(모든 객체는 클래스로부터 생성되잖아...?)
강의에서 설명해주신 부분에 의하면, 인스턴스는 조금 더 관계에 초점을 맞춘 단어이다.
관계에 초점을 맞추다? 이것 또한 헷갈림을 부르지만, 쉽게 이해해보면
student1은 객체이다. student1은 Student 클래스의 인스턴스(관계)이다. 라고 생각하는게 좋다.
실제로 크게 구분하지 않고 사용하니 큰 걱정없이 '관계'에 대해서 이야기할땐 인스턴스라는 용어를 사용하는게 좋겠다.
생성자
객체의 생성과 동시에 변수를 원하는 값으로 초기화할 수 있는 특별한 기능의 메소드
반환 타입이 없고, 클래스 이름과 동일한 이름을 가진다
객체를 생성하면서, 동시에 객체에 값을 넣으려면 생성자를 이용하면 된다.
생성자가 필요한 이유
생성자를 사용하면 객체를 만들자마자 원하는 상태로 초기화할 수 있다.
또한, 필수값을 강제할 수 있다.
객체 생성 시 그 의도에 맞게 필수값을 지정해서, 생성자를 만들어준다면 반드시 그 값을 넣어주어야만 한다.
(ex> 회원객체 생성 시 회원번호는 무조건 존재해야한다 )
생성자를 통해서 필수적인 값들을 먼저 받고,
이후에 나머지 값들을 받는식으로 프로그램을 구성해주면 좋다.
다음과 같이 User 클래스가 있는데, UserNo와 name은 반드시 있어야한다고 강제하면
public class User {
private String userNo;
private String name;
private int age;
private String addr;
private String phone;
}
다음과 같이 userNo와 name을 받는 생성자를 만들어준다.
public User(String userNo, String name) {
this.userNo = userNo;
this.name = name;
}

User 객체 생성 시 필수 파라미터를 넣어주지 않으면 빨간줄이 뜨면서 에러가 발생한다.

이렇게 넣어주면, 성공! 무조건 넣어주게끔 강제할 수 있다.
물론, 어릴적 나의 생각대로 그냥 객체 생성해서 값을 넣어주면 되잖아요? 라고 물어본다면,
그렇게 해도 된다. 어떻게 해도 코드는 돌아가고, 실행되기 때문이다.
좋은 프로그램은 적절한 제약이 있는 프로그램이라고 영한님이 말씀해주신 부분을 생각해보면 좋다.
'Java > 김영한의 실전자바' 카테고리의 다른 글
| 프로세스와 스레드 (0) | 2024.08.13 |
|---|---|
| [김영한의 실전 자바 - 기본편] 상속 정리 (0) | 2024.01.21 |
| [김영한의 실전 자바 - 기본편] 자바 메모리 구조 (0) | 2024.01.21 |
| [김영한의 실전 자바 - 기본편] 기본형과 참조형 (0) | 2024.01.21 |
| [김영한의 실전 자바 - 기본편] 수강 후기 (1) | 2024.01.10 |