TIL/JAVA

[JAVA] 기본형과 참조형

아람2 2024. 11. 26. 23:25
반응형

듣고 있는 강의 - 김영한의 실전 자바 기본편

 

기본형과 참조형 

기본형 Primitive Type 

변수에 사용할 값을 직접 넣을 수 있는 데이터 타입 

직접 사용할 수 있는 값이 들어있다 

ex. int, long, double, boolean 

참조형 Reference Type 

데이터에 접근하기 위한 참조 (주소) 를 저장하는 데이터 타입 

참조형 변수를 통해서 뭔가 하려면 참조값을 통해 해당 위치로 이동해야 한다  

객체 또는 배열에 사용된다 ex. Student student1, int[] students 

객체 - . dot 을 통해 메모리 상에 생성된 객체를 찾아가야 사용할 수 있다 

배열 - [] 를 통해서 메모리 상에 생성된 배열을 찾아가야 사용할 수 있다 

 

  기본형 참조형
변수에 사용할 값  사용할 값을 저장한다  참조 (주소) 를 저장한다 
변수 직접 사용  직접 사용 가능하다  참조값을 통해 해당 위치로 이동해야 한다 
변수 이름 소문자로 시작한다  대문자로 시작한다 
정의 가능 여부  새로 정의할 수 없다  직접 정의할 수 있다 (클래스)

 

📍 String 은 사실 클래스 (참조형) 이지만, 예외적으로, 기본형처럼 문자 값을 바로 대입할 수 있다 

 

기본형 VS 참조형 - 변수 대입 

대원칙 - 자바는 항상 변수의 값을 복사해서 대입한다 

기본형은 변수에 들어 있는 실제 사용하는 값을 복사해서 대입하고,

참조형이면 변수에 들어 있는 참조값을 복사해서 대입한다 (객체의 위치를 가리키는 참조값만 복사된다)

 

기본형 변수에 값을 대입하는 것은 변수에 들어 있는 값을 복사해서 대입하는 것이기 때문에

한 변수가 변경되어도 다른 변수에 영향을 끼치지 않는다 

int a = 10;
int b = a;

 

하지만 참조형의 경우, 실제 사용하는 객체가 아니라 참조값 (주소) 가 복사되기 때문에

참조형 변수에 값이 대입되면, 해당 참조값이 복사되어 하나의 인스턴스를 가리키게 된다 

🐣 두 개의 참조형 변수가 같은 인스턴스를 가리키기 때문에 (참조값이 복사되기 때문에)

일반형 변수와 달리 하나의 변수에서 값을 변경해도 다른 변수가 참조하는 값이 같이 변경된다 🐣

Data dataA = new Data();
dataA.value = 10;
Data dataB = dataA;

 

기본형 VS 참조형 - 메서드 호출 

대원칙 - 자바는 항상 변수의 값을 복사해서 대입한다

기본형이면 변수에 들어 있는 실제 사용하는 값을 복사해서 대입하고,

참조형이면 변수에 들어 있는 참조값을 복사해서 대입한다 

메서드도 마찬가지로, 메서드를 호출할 때 사용하는 매개변수 (파라미터) 도 변수이다 

 

메서드의 매개변수 (파라미터) 는 항상 값을 복사해서 대입하지만, 그 매개변수가 

기본형인 경우 - 메서드 내부에서 매개변수 (파라미터) 의 값을 변경해도, 호출자의 변수 값에는 영향이 없다 

참조형인 경우 - 메서드 내부에서 매개변수 (파라미터) 의 멤버 변수를 변경하면, 호출자의 객체도 변경된다 

ex. 기본형은 종이에 나와 같은 숫자를 써서 넘겨줌, 참조형은 주소를 넘겨주고 받은 사람이 그 주소에 찾아가서 바꿔줌 

 

🐣 그래서 아래 주석처럼 객체의 속성을 하나씩 입력하지 않고, 메서드 하나로 편리하고 간단하게 정보를 입력 받을 수 있다 🐣

package ref;

public class Method1 {
    public static void main(String[] args) {
        /* 학생 정보를 초기화하고 출력하는 예제
        class1 의 ClassStart3 리팩토링 */

        Student student1 = new Student();
        Student student2 = new Student();

//        student1.name = "학생1";
//        student1.age = 15;
//        student1.grade = 90;

//        student2.name = "학생2";
//        student2.age = 16;
//        student2.grade = 80;

        /* 참조형 매개변수 + 메서드를 이용하여 간단하게 정보를 입력 받을 수 있다 */
        initStudent(student1, "학생1", 15, 90);
        initStudent(student2, "학생2", 16, 80);

//        System.out.println("이름:" + student1.name + " 나이:" + student1.age + " 성적:" + student1.grade);
//        System.out.println("이름:" + student2.name + " 나이:" + student2.age + " 성적:" + student2.grade);
        /* 참조형 매개변수 + 메서드를 이용하여 간단하게 출력 가능하다 */
        printStudent(student1);
        printStudent(student2);
    }

    /* 참조형 매개변수와 정보를 받아 학생 정보를 초기화하는 메서드 */
    static void initStudent(Student student, String name, int age, int grade) {
        student.name = name;
        student.age = age;
        student.grade = grade;
    }

    /* 참조형 매개변수를 받아 학생 정보를 출력하는 메서드 */
    static void printStudent(Student student) {
        System.out.println("이름:" + student.name + " 나이:" + student.age + " 성적:" + student.grade);
    }
}

메서드에서 객체 변환 

객체를 생성하고, 초기값을 설정하는 부분이 중복되고 있는데 이 두 개를 하나로 합칠 수 있다 

package ref;

public class Method2 {
    public static void main(String[] args) {
        /* 학생 구조체 생성 + 초기화를 메서드로 만드는 예제
        Method1 리팩토링 - 아래 두 함수 합치기
        - Student student1 = new Student()
        - initStudent(student1, "학생1", 15, 90) */

        /* 참조형 매개변수 + 메서드를 이용하여 간단하게 정보를 입력 받을 수 있다 */
        Student student1 = createStudent("학생1", 15, 90);
        Student student2 = createStudent("학생2", 16, 80);

         /* 참조형 매개변수 + 메서드를 이용하여 간단하게 출력 가능하다 */
        printStudent(student1);
        printStudent(student2);
    }

    /* 학생 구조체를 생성하고 정보를 초기화하는 메서드 */
    static Student createStudent(String name, int age, int grade) {
        Student student = new Student();
        student.name = name;
        student.age = age;
        student.grade = grade;

        return student;
    }

    /* 참조형 매개변수를 받아 학생 정보를 출력하는 메서드 */
    static void printStudent(Student student) {
        System.out.println("이름:" + student.name + " 나이:" + student.age + " 성적:" + student.grade);
    }
}

 

인강 한 번 더 봐야겠다,....!

반응형

'TIL > JAVA' 카테고리의 다른 글

[JAVA] 객체 지향 프로그래밍  (5) 2024.12.06
[JAVA] 변수와 초기화  (0) 2024.12.02
[JAVA][기본] 클래스 Class  (4) 2024.11.16
[JAVA] 메서드 Method 2/2  (0) 2024.11.13
[JAVA] 메서드 Method 1/2  (0) 2024.11.12