개발 공부/[java]

[java] 김영한의 실전 자바 기본편 / 강의 정리 / 1. 클래스와 데이터 1

죽밥죽밥화이팅 2024. 2. 14. 19:22

해당 내용은 인프런에 있는 [김영한의 실전 자바 기본편] 강의를 보고 참고하여 정리한 글이다.

혹시 문제가 된다면 꼭 알려주시길 바랍니도...😢

 

 

 

자바는 클래스와 객체로 이루어져 있음

클래스와 객체라는 개념은 왜 필요하고, 클래스는 어떤 방식으로 발전하면서 만들어졌는지를 배울게 될 것

 

예제)

package class1;

public class ClassStart1 {
    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);

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

        //학생이 늘어날 때마다 변수들을 계속 추가해줘야 함 귀찮아짐
    }
}

 

 

문제1) 배열로 문제 해결해보자

배열 적용으로 학생이 추가돼도 코드 변경을 최소화 하기

 package class1;

public class ClassStart2 {
    public static void main(String[] args) {
        //배열 시 같은 데이터 타입끼리 묶을 수 있음
        String[] studentNames = {"학생1", "학생2"};
        int[] studentAge = {15, 16};
        int[] studentGrade = {90, 80};
        //출력은 반복문으로
        for (int i = 0; i < studentNames.length; i++) {
            System.out.println("이름: " + studentNames[i] + " 나이: " + studentAge[i] + " 성적: " + studentGrade[i]);
        }

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

        //배열 사용으로 코드 변경을 최소화 하기는 했음
    }
}

 

하지만 이름, 나이, 성적을 각각 나누어 관리하는 것은 그리 좋은 방식이 X

 

클래스 도입

클래스를 사용하여 학생이라는 개념을 만든 뒤, 학생 별 이름, 나이, 성적을 관리

package class1;

public class Student {
    String name;
    int age;
    int grade;
}

 

학생 클래스(Studnet)를 정의함 

학생 클래스 내부에 이름(name), 나이(age), 성적(grade) 변수를 가짐

 

클래스에 정의한 변수들 => 멤버 변수 or 필드라고 함

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

     ex) Student, User, MemberService

멤버 변수(Member Variable): 특정 클래스(Student)에 소속된 멤버를 말함

필드(Field): 데이터 항목을 가르키는 전통적인 용어 / 데이터베이스, 엑셀 등에서 데이터 각각의 항목을 필드라 함

자바에서 멤버 변수, 필드는 같은 뜻 / 클래스에 소속된 변수를 뜻함

 

class 예제)

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(); // student1,2는 객체 or 인스턴스라고 함
        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
        
    }
}

 

클래스와 사용자 정의 타입

클래스는 int=> 정수타입 , String=> 문자열 타입 등과 같이 타입처럼 학생도 Student라는 타입을 만들어 관리하고자 함

클래스를 통해 사용자는 원하는 종류의 데이터 타입을 정의하며 직접 설계할 수 있음 => 설계도가 바로 클래스가 되는 것

클래스를 사용해서 실제 메모리에 만들어진 실체를 객체 또는 인스턴스라고 함

 

클래스 : 설계도

객체 or 인스턴스 : 설계도를 기반으로 실제 메모리에 만들어진 실체

예제=> 클래스: 학생(Student) / 객체 or 인스턴스: 학생1(student1), 학생2 (student2)   

 

 

코드 분석

1. 변수 선언

Student student1; //첫 번째 학생을 담을 변수 선언

Student 타입을 받을 수 있는 변수 선언

int는 정수 / String은 문자를 담듯 Student는 Student 타입의 객체(인스턴스)를 받을 수 있음

 

2.객체 생성

student1 = new Student(); //학생을 실제 메모리에 만든다 / 학생은 세가지의 데이터를 가짐

-객체를 생성하려면 클래스를 기반으로 객체(인스턴트)를 생성해야 함

-new Student(): new는 새로 생성한다는 뜻 / new Student ( )는 Student클래스 정보를 기반으로 새로운 객체를 생성하라는 뜻 => 메모리에 실제 Student 객체(인스턴스)를 생성함

-객체 생성 시 new 클래스명 ( )을 사용 / 마지막에 ( )도 추가해 주어야 함

-Student 클래스는 String name, int age, int grade멤버 변수를 가지고 있음 / 이 변수 사용 시에 필요한 메모리 공간도 함께 확보함

 

3. 참조값 보관

 

- 객체 생성 시 자바는 메모리 어딘가에 있는 객체에 접근할 수 있는 참조값(주소)(x001)을 반환함 (x001은 참고값 예시임)

- new 키워드를 통해 객체가 생성되고 나면 참조값을 반환함  / 앞서 선언한 변수 Student student1에 생성된 객체의 참조값(x001) 보관

- Student student1 변수는 이제 메모리에 존재하는 실제 Student 객체(인스턴스)의 참조값을 가지고 있음

- student1 변수는  방금 만든 객체에 접근할 수 있는 참조값을 가지고 있음 / 따라서 이 변수를 통해 객체를 접근(참조)할 수 있음 / 즉, student1변수를 통해 메모리에 있는 실제 객체를 접근 및 사용할 수 있음

 

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

객체를 생성하는 new Student ( ) 코드 자체에는 아무런 이름이 없음 => 단순히 Student 클래스를 기반으로 메모리에 실체 객체를 만드는 것으로 할 일을 다 함 / 생성된 객체에 접근하기 위해서는 객체 생성할 때 반환되는 찹조값을 어딘가에 보관해둬야 함 / Student student1 변수에 참조값(x001)을 저장해두고 저장한 참조값을 통해 실제 메모리에 존재하는 객체에 접근 가능해짐

Student student1 = new Student(); //1. 변수 선언 및 Student 객체 생성
Student student1 = x001; //2. new Student( )의 결과로 x001 참조값 반환
student1 = x001 //3. 최종 결과

 

학생2(student2)까지 생성하면 다음과 같이 Student 객체(인스턴스)가 메모리에 2개 생성되고

각각의 참조값은 달라서 서로 구분 가능

참조값 확인은 객체를 담고 있는 변수를 출력해보면 알 수 있음

System.out.println(student1);
System.out.println(student2);
class1.Student@66a29884
class1.Student@4769b07b

@앞은 패키지 + 클래스 정보를 뜻함 / @ 뒤에 16진수는 참조값

 

 

객체 사용

클래스를 통해 생성한 객체를 사용하기 위해선 메모리에 존재하는 객체에 접근이 필요

객체에 접근하는 방법은 .(점, dot)을 사용하면 됨

//객체 값 대입
student1 = new Student(); //학생을 실제 메모리에 만든다 / 학생은 세가지의 데이터를 가짐
student1.name = "학생1";
student1.age = 15;
student1.grade = 90;
//객체 값 사용
System.out.println("이름: " + student1.name + " 나이: " + student1.age + " 성적: " + student1.grade);

 

객체에 값 대입

객체가 가지고 있는 멤버 변수(name, age, grade)에 값을 대입하려면 .(점, dot) 키워드를 사용하면 됨 / 키워드는 변수(student1)에 들어있는 참조값(x001)을 읽어서 메모리에 존재하는 객체에 접근

student1.name = "학생1"; //1. student1 객체의 name 멤버 변수에 값 대입
x001.name = "학생1"; //2. 변수에 있는 참조값을 통해 실제 객체에 접근, 해당 객체의 name 멤버 변수에 값 대입

1. student1 .(dot)을 사용하면 student1 변수가 가지고 있는 참조값을 통해 실체 객체에 접근

2. x001 객체에 접근하여 name 변수에 "학생1" 데이터 저장

 

 

객체 값 읽기

.(점, dot) 키워드를 통해 참조값을 이용하여 접근 후 원하는 작업을 수행하면 됨

//1. 객체 값 읽기
System.out.println("이름: " + student1.name");
//2. 변수에 있는 참조값을 통해 실제 객체에 접근하고, name 멤버 변수에 접근함
System.out.println("이름: " + x001.name");
//3. 객체의 멤버 변수의 값을 읽어옴
System.out.println("이름: " + "학생1");

 

 

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

-붕어빵 틀을 생각하면 이해하기 쉬워진다. 붕어빵은 틀은 붕어빵 자체가 아님 

이렇게 생긴 붕어빵을 만들기 위한 틀일 뿐,,

실제 먹을 수 있는 팥 붕어빵이 바로 객체 or 인스턴스를 말함

 

클래스 - Class

클래스는 객체를 생성하기 위한 설계도의 개념임

클래스는 객체가 가져야 할 속성(변수)과 기능(메서드)를 정의함 

예제) 학생이라는 클래스는 속성으로  name, age, grade를 가짐

 

객체 - Object

객체는 클래스에서 정의한 속성과 기능을 가진 실체

객체는 서로 독립적인 상태를 가짐

예제) student1은 학생1의 속성을 가지는 객체, student2는 학생2의 속성을 가지는 객체임

         student1과 student2는 같은 클래스에서 만들어졌으나 서로 다른 객체

 

인스턴스 - Instance

인스턴스는 특정 클래스로부터 생성된 객체를 의미함 / 객체와 인스턴스라는 용어는 자주 혼용됨

인스턴스는 주로 객체가 어떤 클래스에 속해 있는지를 강조할 때 사용 

ex) 'student1객체는 Student 클래스의 인스턴스이다.' 라고 표현

 

객체 vs 인스턴스

둘 다 클래스에서 만들어진 실체를 의미 / but 용어상 인스턴스는 객체보다 좀 더 관계에 초점을 맞춘 단어

보통 student1은  Student의 인스턴스이다. 라고 특정 클래스와의 관계를 명확히 할 때 인스턴스라는 용어를 주로 사용

모든 인스턴스는 객체이지만, 우리가 인스턴스라고 부르는 순간은 특정 클래스로부터 그 객체가 생성되었음을 강조하고 싶을 때이다. 예를 들어 student1은 객체이지만, 이 객체가 Student 클래스로부터 생성된다는 점을 명확히 하기 위해 student1을 Student의 인스턴스라고 부름

 

핵심 의미는 같기 때문에 둘 다 구분하지 않고 사용함