ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] 클래스, 객체(인스턴스)
    언어/Java 2024. 11. 4. 10:41

    아래 내용은 김영한의 실전 자바 - 기본편에서 발췌했으며 더 자세한 내용은 아래 링크 섹션2와 3에서 자세히 볼 수 있습니다.

    https://www.inflearn.com/course/%EA%B9%80%EC%98%81%ED%95%9C%EC%9D%98-%EC%8B%A4%EC%A0%84-%EC%9E%90%EB%B0%94-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard

     

    김영한의 실전 자바 - 기본편 강의 | 김영한 - 인프런

    김영한 | 실무에 필요한 자바 객체 지향의 핵심 개념을 예제 코드를 통해 쉽게 학습합니다., 국내 개발 분야 누적 수강생 1위, 제대로 만든 김영한의 실전 자바[사진][임베딩 영상]단순히 자바 문

    www.inflearn.com

    [클래스]

    package class1;
    
    public class Student {
        String name;
        int age;
        int grade;
    }
    • class 키워드를 사용해 Student 클래스를 정의한다.
    • 학생 클래스 내부에는 name, age, grade 변수를 가진다.
      • 클래스 내부에서 정의한 변수들을 (name, age, grade) "멤버 변수" 또는 "필드" 라고 한다.
      • 멤버 변수(Member Variable): 특정 클래스에 소속된 멤버
      • 필드(Field): 데이터 항목을 가리키는 전통적인 용어
    • 클래스는 대문자로 시작하고 낙타 표기법을 사용한다.
      • class Student, class ProductOrder

    [객체]

    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("name: " + student1.name + " age: " + student1.age + " gradre: " + student1.grade);
        }
    }
    • 타입은 데이터의 종류나 형태를 나타낸다.
      • int a; 정수타입 / String str; 은 문자타입 ( 사실 String도 클래스이지만, 자주 사용되기 때문에 Java에서 특별히...)
    • 여기서는 Student 이라는 사용자 정의 타입을 만든 것이다.
    • 즉, 클래스를 사용해서 실제 메모리에 실체를 만들고 이를 "객체" 또는 "인스턴스" 라고 한다.
    • 클래스는 설계도이고, 이 설계도를 기반으로 실제 메모리에 만들어진 실체를 객체 or 인스턴스 라고 한다. (객체 == 인스턴스) 
      • 여기서는 Student 클래스를 기반으로 student1, student2 객체(인스턴스)를 만들었다. 
    인스턴스 vs 객체
    결론은 둘 다 같은 의미이지만, 인스턴스는 관계를 말할 때 주로 사용된다. 예를 들어 student1는 Studentd의 인스턴스야.

    인스턴스: 특정 클래스로부터 생성된 객체를 의미
    객체: 클래스에서 정의한 속성과 기능을 가진 실체

    [참조값 보관]

    • 객체를 생성하면 자바는 메모리 "어딘 가"에 만들어 놓는다. 그리고 이 객체에 접근할 수 있는 참조값(주소)을 반환한다. 
    • 반환된 주소값을 student1 에 보관하여 이 변수를 통해 객체를 접근(참조)할 수 있게 되는 것이다.

    [객체에 값 대입]

    student.name = "학생1";
    student.age = 27;
    student.grade = 80;
    • 객체가 가지고 있는 멤버 변수에 값을 대입하려면 먼저 "객체에 접근
      • 0x001에 접근한다. 
    • . (점, dot) 키워드를 사용해서 값을 대입

    [배열 도입]

    영한 형님의 강조 말씀: 자바에서 대입은 항상 변수에 들어 있는 값을 복사해서 전달한다.
    • 현재 Student[] students; 는 0x005를 가리키고 있다. 
      • 짱구네집 주소는 0x005이다. 그 집 주소 안에는 짱구방의 주소(0x001)와 짱아방의 주소(0x002)가 들어 있다. 
    • 짱구네집 주소 -> 짱구방의 주소를 가서 방 안에 뭐가 있나 봤더니 학생1에 대한 정보가 있었다. 

    [위 내용 이해 했나 문제]

    문제1. 

            int a = 10;
            int b = a;
            System.out.println("a :" + a);   
            System.out.println("b :" + b);   
    
            a = 20;
            System.out.println("a :" + a);   
            System.out.println("b :" + b);   
    
            b = 30;
            System.out.println("a :" + a);  
            System.out.println("b :" + b);

     

    문제2. 

    // class Data
    public class Data {
    	int value;
    }
    
    package ref;
    
    public class VarChange2 {
        public static void main(String[] args) {
            Data dataA = new Data();
            dataA.value = 10;
    
            Data dataB = dataA;
    
            System.out.println("dataA 참조값: " + dataA); 
            System.out.println("dataB 참조값: " + dataB); 
            System.out.println("dataA value: " + dataA.value); 
            System.out.println("dataB value: " + dataB.value);
    
            // dataA change
            dataA.value = 20;
            System.out.println("변경 dataA.value =  20");
            System.out.println("dataA.value: " + dataA.value);   
            System.out.println("dataB.value: " + dataB.value);   
    
            // dataB change
            dataB.value = 30;
            System.out.println("변경 dataB.value =  30");
            System.out.println("dataA.value: " + dataA.value);   
            System.out.println("dataB.value: " + dataB.value);  
        }
    }

     

    .

    .

    .

    .

    .

    .

    .

    [정답1]

    10

    10

    20

    10

    20

    30

    [해설1]

    • int a = 10;
    • int b = a; //  a의 값인 10을 복사해서 b에 넣는다. 
    • a가 b가 되는 게 아니다. 

    [정답2]

    0x001 (주소를 의미함. 실제로 다른 값이 나오겠죠)

    0x001

    10

    10

     

    20

    20

    20

     

    30

    30

    30

    [해설2]

    • dataA와 dataB는 현재 메모리상 같은 주소를 가리키고 있다. 쉽게 말해 dataA와 dataB는 둘 다 짱구네 집 주소를 가리킨다. 
    • 짱구네집에 누가 놀러왔다고 해서 짱구네집 주소가 바뀌진 않잖아 !! 그 안에 있는 내용물들이 바뀌는 것이지. 
    • 짱구네집에 들어갈 수 있는 루트가 여러 개가 되었다고 생각해보자. dataA길 dataB 길 
    • 그럼 그 길을 따라서 도착했을 때 안에 짱구네 어머니가 계실 수도 있잖아. 아니면 짱구네 아버지가 계실 수도 있고. 
    • 위 과정을 dataA 주소를 따라서 간 뒤 짱구를 넣는다. dataB도 짱구네 주소를 가리키니 짱구네 주소를 따라 갔더니 짱구가 있었다.  

     

Designed by Tistory.