1. 클래스 및 데이터

서주홍's avatar
Aug 13, 2024
1. 클래스 및 데이터

■ 클래스가 필요한 이유

💡
자바 세상은 클래스와 객체로 이루어져 있다. 그만큼 클래스와 객체라는 개념은 중요하다.
 
 

■ 클래스에 정의한 변수들을 멤버 변수, 또는 필드라 한다

  • 멤버 변수(Member Variable): 이 변수들은 특정 클래스에 소속된 멤버이기 때문에 이렇게 부른다
  • 필드(Field): 데이터 항목을 가리키는 전통적인 용어이다. 데이터베이스, 엑셀 등에서 데이터 각각의 항목을 필드라 한다.
  • 자바에서 멤버 변수, 필드는 같은 뜻이다. 클래스에 소속된 변수를 뜻한다.
 
 

■ 클래스는 관례상 대문자로 시작하고 낙타 표기법을 사용한다.

ex) Student, User, MemberService
 
 

■ 예제 코드

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 이라고 하면 문자 타입이다.
  • 클래스를 사용하면 int, String과 같은 타입을 직접 만들 수 있다.
  • 사용자가 직접 정의하는 사용자 정의 타입을 만들려면 설계도(클래스)가 필요하다.
  • 설계도인 클래스를 사용해서 실제 메모리에 만들어진 실체를 객체 또는 인스턴스라 한다.
  • 클래스를 통해서 사용자가 원하는 종류의 데이터 타입을 마음껏 정의할 수 있다.
 
 

■ 용어: 클래스, 객체, 인스턴스

  • 클래스는 설계도이다.
    • 이 설계도를 기반으로 실제 메모리에 만들어진 실체를 객체 또는 인스턴스 한다.
    • 객체 또는 인스턴스는 같은 의미로 사용된다.
 
  • 학생(Student) = 클래스
    • 학생1(Student1) = 객체 또는 인스턴스
    • 학생2(Student2) = 객체 또는 인스턴스
 
 

■ 1. 변수 선언

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

■ 2. 객체 생성

  • student1 = new Student()
    • 객체를 사용하려면 먼저 설계도인 클래스를 기반으로 객체(인스턴스)를 생성해야 한다.
    • new Student() : new는 새로 생성한다는 뜻이다. new Student()Student 클래스 정보를 기반으로 새로운 객체를 생성하라는 뜻이다. 이렇게 하면 메모리에 실제 Student 객체(인스턴스)를 생성한다
    • Student 클래스는 String name, int age, int grade 멤버 변수를 가지고 있다. 이 변수를 사용하는데 필요한 메모리 공간도 함께 확보한다.
 
 

■ 3. 참조값 보관

  • student1 = x001
    • 객체를 생성하면 자바는 메모리 어딘가에 있는 이 객체에 접근할 수 있는 참조값(주소)(x001)을 반환한다.(x001은 예시)
    • new 키워드를 통해 객체가 생성되고 나면 참조값을 반환한다. 앞서 선언한 변수인 Student student1에 생성된 객체의 참조값(x001)을 보관한다.
    • Student student1 변수는 이제 메모리에 존재하는 실제 Student 객체(인스턴스)의 참조값을 가지고 있다.
    • student1 변수는 방금 만든 객체에 접근할 수 있는 참조값을 가지고 있다. 따라서 이 변수를 통해서 객체를 접근(참조)할 수 있다. 쉽게 이야기해서 student1 변수를 통해 메모리에 있는 실제 객체를 접근하고 사용할 수 있다.
 
 

■ 4. 참조값을 변수에 보관해야 하는 이유

  • 객체를 생성하는 new Student() 코드 자체에는 아무런 이름이 없다.
  • 이 코드는 단순히 Student 클래스를 기반으로 메모리에 실제 객체를 만드는 것이다.
  • 따라서 생성한 객체에 접근할 수 있는 방법이 필요하다.
  • 이런 이유로 객체를 생성할 때 반환되는 참조값을 어딘가에 보관해두어야 한다.
  • 저장한 참조값(x001)을 통해서 실제 메모리에 존재하는 객체에 접근할 수 있다.

■ 4.1 예제코드

Student student1 = new Student(); //1. Student 객체 생성 Student student1 = x001; //2. new Student()의 결과로 x001 참조값 반환 student1 = x001; //3. 최종 결과
 
이후에 학생2(student2)까지 생성하면 다음과 같이 Student 객체(인스턴스가)가 메모리에 2개 생성된다. 각각 참조값이 다르다.
 
notion image
System.out.println(student1); System.out.println(student2)
 
출력 결과
class1.Student@7a81197d class1.Student@2f2c9b19
💡
@앞은 패키지 + 클래스 정보를 뜻한다.
@뒤에는 16진수는 참조값을 뜻한다
 
 

■ 5 객체 사용

💡
클래스를 통해 생성한 객체를 사용하려면 먼저 메모리에 존재하는 객체에 접근해야 한다. 객체에 접근하려면.(점,dot)을 사용하면 된다
 

■ 5.1 예제 코드

//객체 값 대입 student1.name = "학생1"; student1.age = 15; student1.grade = 90; //객체 값 사용 System.out.println("이름:" + student1.name + " 나이:" + student1.age + " 성적:" + student1.grade)
 

■ 5.2 객체에 값 대입

객체가 가지고 있는 멤버 변수(name, age, grade)에 값을 대입하려면 먼저 객체에 접근해야 한다.
객체에 접근하려면 .(dot) 키워드를 사용해야한다. 이 키워드는 변수(student1)에 들어있는 참조값(x001)을 읽어서 메모리에 존재하는 객체에 접근한다.
 
//1. student1 객체의 name 멤버 변수에 값 대입 student1.name="학생1" //2.변수에 있는 참조값을 통해 실제 객체에 접근, 해당 객체의 name 멤버 변수에 값 대입 x001.name="학생1"
  • student1.(dot)이라고 하면 student1 변수가 가지고 있는 참조값을 통해 실제 객체에 접근한다.
  • student1x001이라는 참조값을 가지고 있으므르 x001 위치에 있는 Student 객체에 접근한다.
 
 

■ 5.3 객체 값 읽기

객체의 값을 읽는 것도 앞서 설명한 내용과 같다. (점, dot) 키워드를 통해 참조값을 사용해서 객체에 접근한 다음에 원하는 작업을 하면 된다.
//1. 객체 값 읽기 System.out.println("이름:" + student1.name); //2. 변수에 있는 참조값을 통해 실제 객체에 접근하고, name 멤버 변수에 접근한다. System.out.println("이름:" + x001.name); //3. 객체의 멤버 변수의 값을 읽어옴 System.out.println("이름:" + "학생1");
 
 

■ 클래스, 객체, 인스턴스 정리

 

■ 클래스 - Class

💡
클래스는 객체를 생성하기 위한 '틀' 또는 '설계도'이다.
클래스는 객체가 가져야 할 속성(변수)과 기능(메서드)를 정의한다.
예를 들어 학생이라는 클래스는 속성으로 name, age, grade 를 가진다.
  • : 붕어빵 틀을 생각해보자. 붕어빵 틀은 붕어빵이 아니다! 이렇게 생긴 붕어빵이 나왔으면 좋겠다고 만드는 틀일뿐이다. 실제 먹을 수 있는 것이 아니다. 실제 먹을 수 있는 팥 붕어빵을 객체 또는 인스턴스라 한다.
  • 설계도: 자동차 설계도를 생각해보자. 자동차 설계도는 자동차가 아니다! 설계도는 실제 존재하는 것이 아니라 개념으로만 있는 것이다. 설계도를 통해 생산한 실제 존재하는 흰색 테슬라 모델 Y 자동차를 객체 또는 인스턴스라 한다
 
 

■ 객체 - Object

💡
객체는 클래스에서 정의한 속성과 기능을 가진 실체이다. 객체는 서로 독립적인 상태를 가진다.
  • student1은 학생1의 속성을 가지는 객체이다.
  • student2는 학생2의 속성을 가지는 객체이다.
    • student1과student2는 같은 클래스에서 만들어졌지만, 서로 다른 객체이다
 
 

■ 인스턴스 - Instance

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

■ 객체 vs 인스턴스

💡
둘다 클래스에서 나온 실체라는 의미에서 비슷하게 사용되지만, 용어상 인스턴스는 객체보다 좀 더 관계에 초점을 맞춘 단어이다.
  • 보통 student1은 Student의 객체이다. 라고 말하는 대신 student1은 Student의 인스턴스이다. 라고 특정 클래스와의 관계를 명확히 할 때 인스턴스라는 용어를 주로 사용한다.
  • 모든 인스턴스는 객체이지만, 우리가 인스턴스라고 부르는 순간은 특정 클래스로부터 그 객체가 생성되었음을 강조하고 싶을 때이다.
    • student1은 객체이지만, 이 객체가 Student 클래스로부터 생성된다는 점을 명확이 하기 위해 student1을 Student의 인스턴스라고 부른다.
    • 하지만 둘다 클래스에서 나온 실체라는 핵심 의미는 같기 때문에 보통 둘을 구분하지 않고 사용한다
 
Share article

maestrojava