본문 바로가기
내일배움캠프(Sparta)/Java Handbook

[Java Handbook] Part 5-1

by mmm- 2023. 9. 12.

1. 클래스와 객체

클래스

: 객체를 생성하기 위한 일종의 설계도. 속성과 행위를 수행하는 객체의 집합 (붕어빵 틀로 비유)

 

클래스의 용도

: 객체를 생성하는 데 사용

 

클래스의 탄생 과정

  1. 변수: 하나의 데이터를 저장할 수 있는 공간
  2. 배열: 같은 종류의 여러 데이터를 하나로 저장할 수 있는 공간
  3. 구조체: 서로 연관된 여러 데이터(종류 상관X)를 하나로 저장할 수 있는 공간
  4. 클래스: 데이터와 함수의 결합(구조체 + 함수)
import java.sql.Time;

public class Time3_1 {
    int hour;
    int min;
    int sec;
}

class Time3_1Main {
    public static void main(String[] args) {
        // 총 3명의 시간을 객체로 관리
        Time3_1 t1 = new Time3_1();
        Time3_1 t2 = new Time3_1();
        Time3_1 t3 = new Time3_1();

        // 총 3명의 시간을 객체 배열로 관리
        Time3_1[] timeArr = new Time3_1[3];
        timeArr[0] = new Time3_1();
        timeArr[1] = new Time3_1();
        timeArr[2] = new Time3_1();
    }
}

→ 원하는 타입 만드는 것이 가능


객체

: 자신 고유의 속성을 가지는 물리적, 추상적인 모든 대상 (클래스의 인스턴스, 붕어빵으로 비유)

객체 = 속성(변수) + 기능(메서드)

객체의 용도

: 객체가 가지고 있는 속성과 기능에 따라 다름


인스턴스

: 객체 하나하나를 의미

 

인스턴스화

: 클래스 → 인스턴스(객체)


2. 객체의 생성

객체 생성 방법

Tv t; // Tv 클래스 타입의 참조변수 t 선언
t = new TV(); // Tv인스턴스 생성 후 생성된 Tv인스턴스 주소 t에 저장

3. 객체의 사용

public class Tv1_1 {
    // 속성 : 변수 선언
    String color;
    boolean power = false;
    int channel = 1;

    void power() {
        power = !power;
        if(power) {
            System.out.println("전원 ON");
        } else {
            System.out.println("전원 OFF");
        }
    }

     void channelUp() {
        channel++;
        System.out.println("채널 증가");
     }
     void channelDown() {
        channel--;
        System.out.println("채널 감소");
     }
}

class Tv1_1Main {
    public static void main(String[] args) {
        Tv1_1 t1 = new Tv1_1();
        t1.color = "검정색";
        Tv1_1 t2 = new Tv1_1();
        t2.color = "흰색";

        System.out.println("TV1 인스턴스 색깔 = " + t1.color);
        System.out.println("TV2 인스턴스 색깔 = " + t2.color);

        t1.power();
        System.out.println("TV2 인스턴스 색깔 = " + t1.channel);

        t1.channelUp();
        System.out.println("TV1 인스턴스 채널 = " + t2.channel);
        t1.channelDown();
        System.out.println("TV1 인스턴스 채널 = " + t2.channel);

        t1.power();

        t2 = t1; // TV2 인스턴스 참조변수에 TV1 인스턴스의 주소 저장했을 때

        // 흰색이었던 TV2 인스턴스의 색깔이 바뀐 것이 아니라
        // 참조변수 t2에 저장되어있던 TV2 인스턴스의 주소가 없어지고
        // TV1의 주소가 t2 참조변수에 저장됨
        System.out.println("TV1 인스턴스 색깔 = " + t1.color);
        System.out.println("TV2 인스턴스 색깔 = " + t2.color);

    }
}

4. 객체 배열

객체 배열

: 여러 개의 객체를 담을 수 있는 배열

객체 배열 == 참조변수 배열
public class Tv1_2 {
    String color;
    boolean power = false;
    int channel = 1;

    String brand; // 브랜드 이름 속성 추가

    void power() {
        power = !power;
        if(power) {
            System.out.println("전원 ON");
        } else {
            System.out.println("전원 OFF");
        }
    }

    void channelUp() {
        channel++;
        System.out.println("채널 증가");
    }
    void channelDown() {
        channel--;
        System.out.println("채널 감소");
    }
}

class Tv1_2Main {
    public static void main(String[] args) {
        Tv1_2[] tvArr = new Tv1_2[3];

        tvArr[0] = new Tv1_2();
        tvArr[1] = new Tv1_2();
        tvArr[2] = new Tv1_2();
        
        tvArr[0].color = "보라색";
        tvArr[1].color = "주황색";
        tvArr[2].color = "핑크색";

        for(int i=0; i<tvArr.length; i++) {
            System.out.println(i + 1 + "번째 Tv인스턴스 색깔 : " + tvArr[i].color);
        }

        for(int i=0; i<tvArr.length; i++) {
            System.out.println(i + 1 + "번째 Tv인스턴스 ");
            tvArr[i].power();
        }

        System.out.println();

        for(int i=0; i<tvArr.length; i++) {
            System.out.println(i + 1 + "번째 Tv인스턴스의 브랜드 명: ");
            System.out.println(tvArr[i].brand);
        }
        System.out.println();

        // 새로운 참조변수에 배열 안에 들어있는 객체 주소 값 배정
        Tv1_2 samsung = tvArr[0];
        Tv1_2 lg = tvArr[1];
        Tv1_2 apple = tvArr[2];

        // 참조변수를 사용해서 배열안에 넣어준 객체에 접근해서 각 인스턴스에 브랜드 이름 추가하기
        samsung.brand = "samsung";
        lg.brand = "lg";
        apple.brand = "apple";

        for(int i=0; i<tvArr.length; i++) {
            System.out.println(i + 1 + "번째 Tv인스턴스의 브랜드 명: ");
            System.out.println(tvArr[i].brand);
        }
    }
}

5. 선언 위치에 따른 변수의 종류

클래스 영역: 클래스 변수

  • 선언위치: 클래스 내부, 메서드 밖
  • 특징
    • 클래스가 메모리에 올라갈 때 생성됨
    • 객체를 생성하지 않아도 생성
    • 모든 인스턴스들이 공유
    • 모든 인스턴스가 공유하는 상수나 설정값을 저장하는 용도로 사용
    • static 키워드로 표시
    • 프로그램이 시작될 때 클래스 변수가 초기화되며, 프로그램 종료시까지 유지
  • 접근 방법: 클래스명. 클래스변수명

 

클래스 영역: 인스턴스 변수

  • 선언위치: 클래스 내부, 메서드 밖에서 선언되지만 인스턴스(객체)를 생성할 때 각 인스턴스별로 메모리에 할당됨
  • 특징
    • 객체가 생성될 때 인스턴스 변수 생성
    • 각 객체마다 별도의 값을 가짐
    • 클래스 내부에서 static 키워드 없이 선언됨
    • 인스턴스가 생성될 때 초기화하며, 인스턴스의 수만큼 개별적으로 관리됨
    • 객체의 상태나 속성을 저장하는데 사용
  • 접근 방법: 참조변수명.인스턴스변수명

 

메서드 영역: 지역 변수

  • 선언위치: 메서드나 블록 내에서 선언
  • 특징
    • 선언된 블록 내부에서만 접근 가능
    • 메서드 또는 블록이 실행될 때 생성되고 블록을 벗어나면 소멸
    • 메서드의 매개변수도 지역변수로 간주됨
    • 메서드 내에서 일시적인 데이터 저장 또는 연산에 사용
public class Obj4_1 {
    int iv; // 인스턴스 변수
    static int cv; // 클래스 변수(static 변수, 공유 변수)

    void method() {
        int lv;
        lv = 30;

        // 지역변수는 자동으로 초기화가 되지 않기 때문에 사용하려면 반드시 초기화 필요
        System.out.println("lv 지역 변수 = " + lv);
    }
}

class Obj4_1Main {
    public static void main(String[] args) {
        // 클래스 변수 접근 및 사용
        Obj4_1.cv = 10;
        System.out.println("ObjVar .cv 클래스 변수 = " + Obj4_1.cv);
        
        // 인스턴스 변수 생성 및 사용
        // Obj4_1.iv = 20; // error. 인스턴스를 통해서만 생성 및 사용 가능
        Obj4_1 objVar = new Obj4_1();
        objVar.iv = 20;
        System.out.println("objVar.iv 인스턴스 변수 = " + objVar.iv);
        
        // 지역 변수 생성 및 사용
        // objVar.lv // error. 인스턴스로 지역 변수 바로 접근 불가능
        objVar.method(); // 메서드 호출시 지역 변수 생성
        // 메서드 종료시 지역 변수 삭제
    }
}

'내일배움캠프(Sparta) > Java Handbook' 카테고리의 다른 글

[Java Handbook] Part 5-3  (0) 2023.09.13
[Java Handbook] Part 5-2  (0) 2023.09.13
[Java Handbook] Part 4-2  (0) 2023.09.12
[Java Handbook] Part 4-1  (0) 2023.09.12
[Java Handbook] Part 3-2  (0) 2023.09.12