응애개발자
article thumbnail
728x90

1. 클래스가 필요한 이유

코드를 통해 살펴보겠습니다.

 

1-1. 변수 사용하기

package class1;

public class ClassStart1 {
 public static void main(String[] args) {
 
 //학생 1
 String student1Name = "학생1";
 int student1Age = 15;
 int student1Grade = 90;
 
 //학생 2
 String student2Name = "학생2";
 int student2Age = 16;
 int student2Grade = 80;
 
 //출력
 System.out.println("이름:" + student1Name + " 나이:" + student1Age + " 성적:" + student1Grade);
 System.out.println("이름:" + student2Name + " 나이:" + student2Age + " 성적:" + student2Grade);
 }
}

//출력 결과
이름:학생1 나이:15 성적:90
이름:학생2 나이:16 성적:80

 

변수를 사용하여 학생의 이름, 나이, 성적을 출력하면 위와 같이 나타낼 수 있습니다. 하지만 이 코드는 학생이 늘어날 때 마다 변수를 추가로 선언해야 하고, 출력 코드를 추가해야 하기 때문에 배열을 사용하는 방법도 있습니다.

 

 

1-2. 배열 사용하기

package class1;

public class ClassStart2 {
    public static void main(String[] args) {
    
    	//배열 선언
        String[] studentNames = {"학생1", "학생2"};
        int[] studentAges = {15, 16};
        int[] studentGrades = {90, 80};
    	
        //반복문 출력
        for (int i = 0; i < studentNames.length; i++) {
            System.out.println("이름:" + studentNames[i] + " 나이:" + studentAges[i] + " 성적:" + studentGrades[i]);
        }
    }
}

//출력 결과
이름:학생1 나이:15 성적:90
이름:학생2 나이:16 성적:80

 

배열을 사용하면 학생이 추가되어도 배열에 학생의 데이터만 추가하면 됩니다. 이제 변수를 더 추가하지 않아도 되고, 출력 코드도 유지할 수 있습니다.

 

 

1-3. 배열 사용의 한계

배열을 사용하여 코드 변경을 최소화했지만, 학생의 데이터를 제거하려면 정확하게 해당 요소를 찾아서 제거해야 하는 단점이 생깁니다. 

String[] studentNames = {"학생1", "학생3", "학생4", "학생5"};
int[] studentAges = {15, 17, 10, 16};
int[] studentGrades = {90, 100, 80, 50};

 

예를들어 위와 같이 한 학생의 데이터가 3개의 배열에 나누어져 있기 때문에 3개의 배열을 각각 변경해야 합니다. 그리고 한 학생의 데이터를 관리하기 위해 3개 배열의 인덱스 순서를 항상 정확하게 맞춰주어야 합니다. 이렇게 하면 특정 학생의 데이터를 변경할 때 실수할 가능성이 매우 높습니다. ( 좋은 코드 x )

그래서 이 문제를 해결하기 위해 클래스를 도입해보겠습니다.

 


2. 클래스 도입

클래스를 통해 학생이라는 개념을 만들어 학생 별로 본인의 이름, 나이, 성적을 관리해 보겠습니다.

 

 

2-1. 클래스 선언하기

package class1;
public class Student {
 String name;
 int age;
 int grade;

}

 

class 키워드를 사용하여 학생 클래스(Student)를 정의하고, 학생 클래스 내부에 이름(name), 나이(age), 성적(grade) 변수를 선언해줍니다.

클래스에 정의한 변수들을 멤버 변수, 또는 필드라고 합니다.
멤버 변수 (Member Variable) : 이 변수들은 특정 클래스에 소속된 멤버이기 때문에 멤버 변수로 불립니다.
필드 (Field) :  데이터 항목을 가리키는 전통적인 용어입니다.
자바에서 멤버 변수, 필드는 같은 뜻으로 사용됩니다. (클래스에 소속된 변수)
클래스 이름은 관례상 대문자(PascalCase)로 시작합니다.
*네이밍 규칙은 블로그에 정리해두겠습니다.

 

위에서 클래스를 정의해 주었으므로, 밑에서 해당 클래스를 사용해 보겠습니다.

 

 

2-2. 클래스를 사용하여 출력하기

package class1;

public class ClassStart3 {
    public static void main(String[] args) {
            //클래스 사용
            Student student1;
            
            //학생1 생성
            student1 = new Student();
            student1.name = "학생1";
            student1.age = 15;
            student1.grade = 90;
            
            //학생2 생성
            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);
    }
}

//출력 결과
이름:학생1 나이:15 성적:90
이름:학생2 나이:16 성적:80

 

 

2-3. 정리

타입은 데이터의 종류나 형태를 나타냅니다.
int정수 타입, String문자 타입 입니다.
클래스를 사용하면 int, String 같은 타입을 직접 만들 수 있습니다.
사용자가 직접 정의하는 사용자 정의 타입을 만들려면 설계도가 필요합니다. 이 설계도가 바로 클래스입니다.
설계도인 클래스를 사용해서 실제 메모리에 만들어진 실체를 객체 또는 인스턴스라고 합니다.
클래스를 통해서 사용자가 원하는 종류의 데이터 타입을 마음껏 정의할 수 있습니다.

 

클래스는 설계도이고, 클래스(설계도)를 기반으로 실제 메모리에 만들어진 실체를 객체 또는 인스턴스라 합니다.(같은 의미)

 


3. 코드 분석

위 코드를 조금 더 상세히 알아보며 기초에 대해 다져보겠습니다.

 

3-1. 변수 선언

//클래스 사용
Student student1;

설명

  • Student 타입을 받을 수 있는 변수를 선언한다.
  • int는 정수, String은 문자를 담을 수 있듯이 Student는 Student 타입의 객체(인스턴스)를 받을 수 있다.

 

3-2. 객체 생성

//객체 생성
student1 = new Student()

설명

  • 객체를 사용하려면 먼저 설계도인 클래스를 기반으로 객체(인스턴스)를 생성해야 합니다.
  • new Student() : new는 새로 생성한다는 뜻입니다. new Student() 는 Student 클래스 정보를 기반으로 새로운 객체를 생성하라는 뜻입니다. 이렇게 하면 메모리에 실제 Student 객체(인스턴스)를 생성합니다.
  • 객체를 생성할 때는 new '클래스명()' 을 사용하면 됩니다.
  • Student 클래스는 String name, int age, int grade 라는 멤버 변수를 가지고 있습니다. 

 

 

3-3. 참조값 보관

설명

  • 객체를 생성하면 자바는 메모리 어딘가에 있는 이 객체에 접근할 수 있는 참조값(주소) ( x001 )을 반환합니다.
  • 여기서 x001 은 참조값입니다. (실제 x001 처럼 표현되는 건 아니고 이해를 돕기 위한 예시입니다.)
  • new 키워드를 통해 객체가 생성되고 나면 참조값을 반환합니다. 따라서 Student student1은 참조값 ( x001)을 보관합니다.
  • 결론적으로 student1 변수를 통해 메모리에 있는 실제 객체를 접근할 수 있습니다.
참조값을 변수에 보관하는 이유
객체를 생성하는 new Student() 코드 자체에는 아무 이름이 없습니다. 이 코드는 단순히 Student 클래스를 기반으로 메모리에 실제 객체를 만드는 것입니다. 따라서 생성한 객체에 접근할 수 있는 방법이 필요하기 때문에 참조값을 어딘가에 보관해두어야 합니다. 

 


4. 객체 사용

클래스를 통해 생성한 객체를 사용하려면 메모리에 존재하는 객체에 접근해야 합니다. 객체에 접근하려면 .(dot)을 사용하면 됩니다.

package class1;

public class ClassStart1 {
    public static void main(String[] args) {
    
            Student student1 = new Student();
            
            //객체 값 대입
            student1.name = "학생1";
            student1.age = 15;
            student1.grade = 90;
            
            //객체 값 사용
            System.out.println("이름:" + student1.name + " 나이:" + student1.age + " 성적:" +  student1.grade);
    }
}

//출력 결과
이름:학생1 나이:15 성적:90

 

설명

객체가 가지고 있는 멤버 변수(name, age, grade)에 값을 대입하려면 먼저 객체에 접근해야 합니다.

객체에 접근하려면 . (점, dot) 키워드를 사용하여 참조값( x001 ) 을 읽어서 메모리에 존재하는 객체에 접근합니다.

student1은 x001 이라는 참조값을 가지고 있으므로 x001 위치에 있는 Student 객체에 접근할 수 있습니다.

 


5. 클래스, 객체, 인스턴스 정리

5-1. 클래스 - Class

클래스는 객체를 생성하기 위한 '틀' 또는 '설계도' 입니다. 클래스는 속성(변수)과 기능(메서드)을 정의할 수 있습니다. 예를들어 위의 예시처럼 학생이라는 클래스는 속성으로 name, age, grade를 갖습니다. 기능(메서드)는 다음글에서 설명드리겠습니다.

  • 틀(설계도) : 붕어빵 틀을 생각해봅시다. 붕어빵 틀은 이런 붕어빵이 있으면 좋겠다고 만드는 틀일 뿐입니다. 이런 틀을 클래스, 틀을 통해서 나온 붕어빵이 객체 또는 인스턴스 라고 합니다. 

 

5-2. 객체 - Object

객체는 클래스에서 정의한 속성과 기능을 가진 실체입니다. 객체는 서로 독립적인 상태를 갖습니다.

예를 들어 student1과 student2는 같은 클래스에서 만들어졌지만, 서로 다른 객체입니다.

 

5-3. 인스턴스 - Instance

인스턴스는 특정 클래스로부터 생성된 객체를 의미합니다. 그래서 객체와 인스턴스라는 용어는 자주 혼용됩니다. 인스턴스는 주로 객체가 어떤 클래스에 속해 있는지 강조할 때 사용합니다. 예를들어 student1 객체는 Student 클래스의 인스턴스다. 라고 표현합니다.

 

5-4. 객체 vs 인스턴스

둘다 클래스에서 나온 실체라는 의미에서 비슷하게 사용되지만, 용어상 인스턴스는 객체보다 좀 더 관계에 초점을 맞춘 단어입니다. 보통 student1은 Student의 객체입니다. 라고 말하는 대신 student1은 Student의 인스턴스입니다. 라고 특정 클래스와의 관계를 명확히 할 때 인스턴스라는 용어를 주로 사용합니다.

좀 더 쉽게 말하자면, 모든 인스턴스는 객체이지만, 우리가 인스턴스라고 부르는 순간은 특정 클래스로부터 그 객체가 생성되었음을 강조하고 싶을 때 사용합니다.

예를들어 student1은 객체이지만, 이 객체가 Student 클래스로부터 생성되었다는 점을 명확히 하기 위해서 student1을 Student의 인스턴스라고 부릅니다.

 

하지만 둘 다 클래스에서 나온 실체라는 핵심 의미는 같기 때문에 보통 둘을 구분짓지 않고 사용합니다.

'Language > Java' 카테고리의 다른 글

[Java] 생성자  (0) 2023.12.18
[Java] 절차지향, 객체 지향 프로그래밍  (0) 2023.12.17
[Java] 변수와 초기화  (0) 2023.12.17
[Java] 인자, 매개변수  (1) 2023.12.14
[Java] 기본형과 참조형  (2) 2023.12.13
profile

응애개발자

@Eungae-D

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!