Home 김영한의 실전 자바 - 클래스와 데이터
Post
Cancel

김영한의 실전 자바 - 클래스와 데이터

클래스와 데이터

  • 김영한님의 실전 자바 강의 중 클래스와 데이터 챕터를 학습하며 클래스가 왜 필요한지, 그리고 메모리상에서 어떻게 동작하는지를 정리함

클래스 도입의 필요성

배경

  • 왜 클래스가 필요한가
    • 프로그래밍을 하다 보면 서로 관련된 데이터들을 한꺼번에 관리해야 하는 상황이 발생함
    • 변수와 배열만으로는 데이터의 연관성을 완벽하게 표현하고 관리하는 데 한계가 있음

변수 사용의 한계

  • 상황 가정
    • 게임 캐릭터를 관리한다고 가정
  • 문제점
    • 캐릭터가 늘어날 때마다 변수를 계속 선언해야 함
    • 캐릭터의 정보를 출력하는 코드도 변수 개수만큼 늘어나 유지보수가 힘듦

배열 사용의 한계와 위험성

  • 구조적 문제
    • 배열을 사용하면 데이터를 하나로 묶을 수는 있음
    • 캐릭터의 속성인 이름, 레벨, 체력이 서로 다른 배열에 쪼개져 저장됨
  • 관리의 위험
    • 특정 캐릭터의 데이터를 삭제하거나 수정할 때 발생
    • 모든 배열의 인덱스를 정확하게 맞춰야 하는 번거로움과 위험이 따름
    class="highlight">
    1
    2
    3
    4
    5
    6
    7
    8
    
    // 배열 사용의 문제점
    // 데이터가 분산되어 관리됨
    String[] characterNames = {"전사", "마법사"};
    int[] characterLevels = {10, 20};
    int[] characterHps = {100, 80};
    
    // 인덱스 0번을 삭제하려면 3개의 배열 모두 건드려야 함
    // 실수 가능성 매우 높음
    



    클래스의 등장

    클래스 개념 도입

    • 해결책
      • 캐릭터라는 개념을 하나로 묶어 관리할 필요성이 대두됨
      • Character 클래스를 만들어 이름, 레벨, 체력을 한 곳에서 관리함
    class="highlight">
    1
    2
    3
    4
    5
    
    public class Character {
        String name;
        int level;
        int hp;
    }
    



    용어 정리

    클래스 (Class)

    • 정의
      • 객체를 생성하기 위한 설계도 또는 틀
      • 객체가 가져야 할 속성인 멤버 변수와 기능을 정의함
    • 멤버 변수 (Member Variable)
      • 클래스 내부에 정의된 변수
      • 데이터베이스의 필드와 유사한 개념

    객체 (Object)와 인스턴스 (Instance)

    • 객체
      • 클래스에서 정의한 속성과 기능을 가진 실체
    • 인스턴스
      • 특정 클래스로부터 생성된 객체임을 강조할 때 사용함
      • character1Character의 인스턴스라고 표현함



    객체 생성과 메모리 구조

    객체 생성 과정

    • new 키워드와 참조 값
      • new Character()를 호출하면 메모리에 실제 객체가 생성되고 참조 값인 주소가 반환됨
      • 변수에는 객체 자체가 아니라 이 참조 값이 저장됨
      class="highlight">
      1
      2
      3
      4
      
      // x001 참조 값 반환 및 저장
      Character character1 = new Character();
      // 참조 값을 통해 접근
      character1.name = "전사";
      

      참조 값의 이해

      • 대입의 원칙
        • 자바는 항상 변수의 값을 복사해서 대입함
        • 객체를 대입하는 경우 객체 자체가 복사되는 것이 아니라 참조 값만 복사됨
      • 객체 접근
        • 점(.) 연산자를 사용함
        • 변수에 저장된 참조 값을 통해 실제 메모리에 존재하는 객체에 접근함



      객체 배열과 리팩토링

      배열과 객체의 결합

      • 구조
        • 배열도 객체를 직접 저장하는 것이 아니라 객체의 참조 값을 저장함
        • 배열 생성 시에는 배열의 크기만큼 참조 값을 담을 공간이 확보됨
        class="highlight">
        1
        2
        3
        
        Character[] characters = new Character[2];
        // character1의 참조 값(x001)이 복사되어 들어감
        characters[0] = character1;
        

        리팩토링 효과

        • 향상된 for문 활용
          • 배열을 사용하면 반복문을 통해 로직을 깔끔하게 관리할 수 있음
          • 객체 지향적인 코드로 데이터와 기능 관리가 수월해짐
          class="highlight">
          1
          2
          3
          4
          
          // 배열 도입 후 최적화된 출력 로직
          for (Character c : characters) {
              System.out.println("이름:" + c.name + " 레벨:" + c.level + " 체력:" + c.hp);
          }
          



          요약 정리

          데이터 관리의 진화

          • 발전 과정
            • 변수 → 배열 → 클래스로 발전함
            • 클래스를 통해 관련된 데이터를 하나로 묶어 관리할 수 있게 됨
            • 사람이 이해하기 쉬운 구조로 프로그래밍이 가능해짐

          자바 메모리 대원칙

          • 참조 값 복사
            • 자바에서 변수의 대입은 항상 값을 복사해서 전달함
            • 기본형은 실제 값을 복사함
            • 참조형은 객체의 위치를 가리키는 참조 값을 복사함
          • 객체와 참조
            • 변수에는 객체가 들어있는 것이 아님
            • 변수에는 객체에 접근할 수 있는 리모컨인 참조 값이 들어있음
            • 이 참조 값을 통해 메모리에 있는 실제 객체에 접근하고 데이터를 조작함



          연습 문제

          1. 여러 학생의 이름, 나이, 성적을 각각의 배열로 따로 관리할 때 가장 어려운 점은 무엇인가?

            a. 학생 정보가 흩어져 관리가 불편하고 실수가 쉽다.

            • 학생 한 명의 데이터가 여러 배열에 나뉘어 있으므로, 정보 수정 시 각 배열을 모두 신경 써야 해 번거롭고 오류가 생기기 쉬움
            • 이런 문제를 클래스로 해결할 수 있음
          2. 객체 지향에서 클래스가 하는 가장 중요한 역할은 무엇인가요?

            a. 객체를 만드는 설계도 또는 틀 역할

            • 클래스는 실제 메모리에 만들어질 객체가 어떤 속성과 기능을 가질지 정의하는 설계도와 같음
            • 이 설계도를 바탕으로 객체를 만듬
          3. Student student1; 처럼 클래스 타입 변수에 저장되는 값은 무엇인가요?

            a. Student 객체의 메모리 위치를 가리키는 참조값

            • 자바에서 클래스 타입 변수는 객체 자체가 아닌, 해당 객체가 메모리 어디에 있는지 알려주는 ‘참조값’을 저장함
            • 객체는 메모리 다른 곳에 있음
          4. Student[] students 같은 객체 배열의 각 요소를 순서대로 처리할 때 주로 쓰는 제어문은 무엇인가요?

            a. for 문 (향상된 for 포함)

            • 배열의 모든 요소를 처음부터 끝까지 방문하며 처리하는 작업은 for 문에 가장 적합함
            • 향상된 for 문을 쓰면 더 편리하게 반복할 수 있음
          5. 클래스로부터 new를 이용해 메모리에 만든 실제 결과물은 무엇일까요?

            a. 인스턴스 (또는 객체)

            • 클래스는 설계도이고, new 키워드로 이 설계도를 바탕으로 메모리에 실제화한 것이 바로 인스턴스, 즉 객체임
            • 실제 데이터를 담고 사용됨



          Reference

          Contents

          정렬 알고리즘이란?

          Git Push 실패: RPC failed HTTP 400 에러 해결하기