강의 예제 중 클래스가 왜 필요한지에 대한 내용이다.
package class1;
public class ClassStart1 {
public static void main(String[] args) {
String student1Name = "학생1";
String student2Name = "학생2";
int student1Age = 15;
int student2Age = 16;
int student1Score = 90;
int student2Score = 80;
System.out.println("이름: " + student1Name + "나이: " + student1Age + "점수: " + student1Score);
System.out.println("이름: " + student2Name + "나이: " + student2Age + "점수: " + student2Score);
}
}
이름: 학생1 나이: 15 성적: 90
이름: 학생2 나이: 16 성적: 80
이라는 내용을 출력해야 한다.
위와 같이 코드를 작성할 수 있으나, 학생3이 추가된다면 추가될 때마다 변수를 추가로 선언해야하고 여러가지로 번거롭다.
입문강의에서 배운 배열을 사용해 리팩토링을 해보자.
package class1;
public class ClassStart2 {
public static void main(String[] args) {
String[] studentName = {"학생1", "학생2"};
int[] studentAge = {15, 16};
int[] studentScore = {90, 80};
for (int i = 0; i < studentName.length; i++) {
System.out.println("이름: " + studentName[i] + " 나이: " + studentAge[i] + " 점수: " + studentScore[i]);
}
}
}
배열을 사용해 코드를 리팩토링 해봤다.
확실히 이전보다 코드가 간결해졌다. 하지만 마찬가지로 데이터가 추가되거나 삭제할 때 해당 데이터에 맞는 인덱스를
일일이 지우는게 쉽지만은 않을 것이다.
배열을 사용하는 것도 데이터를 관리하기 좋은 방식은 아닌 것 같다.
다음은 클래스를 도입해봤다.
package class1;
public class Student {
String name;
int age;
int grade;
}
Student Class를 생성했다.
학생 클래스의 내부에 name, age, grade 의 변수가 있다.
위와 같이 클래스에 정의한 변수를 멤버 변수, 또는 필드라고 한다.
package class1;
public class ClassStart3 {
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;
System.out.println("이름: " + student1.name + " 나이: " + student1.age + " 성적: " + student1.grade);
System.out.println("이름: " + student2.name + " 나이: " + student2.age + " 성적: " + student2.grade);
}
}
학생 클래스를 사용하는 코드를 작성해봤다.
타입은 데이터의 종류나 형태를 나타낸다. int 는 정수, String은 문자 타입이다.
위 코드는 Student라는 타입을 직접 만든것이다.
사용자가 직접 정의하는 사용자 정의 타입을 만들기 위해 설계도가 필요한데, 이 설계도가 클래스이다.
클래스를 사용해서 실제 메모리에 만들어진 실체를 객체 또는 인스턴스라고 한다.
위 코드에선 Student 클래스를 이용해 student1, student2 객체 (인스턴스)를 만들었다.
student1 = new Student의 코드가 실행되면, Student 인스턴스의 참조값이 student1에 대입된다.
이로써 student1이 Student 클래스에 접근할 수 있게 되고, Student 필드를 사용할 수 있게된다.
객체를 사용하기 위해선 점 (.)을 사용해 객체에 접근할 수 있다.
println(student1.name)이 작동하면 위와 같은 순서로 작동하게 된다.
클래스, 객체, 인스턴스 정리
클래스 (Class)
클래스는 객체를 생성하기 위한 '틀' 또는 '설계도'이다. (이전에 지겹도록 들은 붕어빵틀과 자동차 설계도를 생각하자)
클래스는 객체가 가져야 할 속성(변수)과 기능(메서드)를 정의한다. 위 코드에서의 속성은 name, age, grade가 되겠다.
메서드는 위 코드에서 다루지 않았다.
- 틀: 붕어빵 틀은 붕어빵이 아니다. 실제로 먹을 수 있는 붕어빵은 팥 붕어빵(객체 또는 인스턴스라 한다.)이다.
- 설계도: 자동차 설계도는 자동차가 아니다. 설계도를 통해 생산한 흰색 테슬라 모델Y 자동차를 객체 또는 인스턴스라 한다.
객체 (Object)
객체는 클래스에서 정의한 속성과 기능을 가진 실체이다. (팥 붕어빵, 흰색 테슬라)
위 코드에선 student1은 학생1의 속성을 가진 객체이다. student2도 마찬가지.
student1과 student2는 같은 클래스에서 만들어졌지만, 다른 객체이다.
객체 vs 인스턴스
객체와 인스턴스는 많이 혼용되어 부른다. 다만 용어상으로 인스턴스는 객체보다 좀 더 관계에 초점을 맞춘 단어이다.
예를 들어 student1은 Student의 객체이다(x) / student1은 Student의 인스턴스이다(o)
위에선 좀 극단적으로 o,x를 사용했지만 둘 다 클래스에서 나온 실체라는 핵심의미는 같기에 둘을 구분하지 않아도 된다.
굳이 따지자면 '인스턴스이다'가 조금 더 자연스럽지 않나?라는 느낌인듯하다.
그림이 꽤 지저분한데 정보공유의 목적을 둔 블로그가 아니기 때문에.. 혹시나 이 글로 공부를 하는사람이 있다면 양해 부탁드립니다....