[JAVA] 클래스와 객체

    클래스, 객체, 인스턴스

    클래스란 객체를 정의해 놓은 것

    클래스는 객체를 생성하는데 사용

    클래스 (제품 설계도)  <-> 객체(제품)

     

    클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화(Instantiate)라고 한다.

    어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스(Instance)라고 한다.

     

    객체는 모든 인스턴스를 대표하는 포괄적인 의미를 갖고, 인스턴트는 어떤 클래스로부터 만들어진 것인지를 강조하는 보다 구체적인 의미를 가짐

    예) 책상은 인스턴스다 (x) -> 책상은 객체다 (o)

    책상은 책상 클래스의 객체이다 (x) -> 책상은 책상 클래스의 인스턴스다 (o)

     

    객체의 구성요소 - 속성, 기능

    속성(property) - 멤버변수(member variable), 특성(attribute), 필드(field), 상태(state)

    기능(function) - 메서드(method), 함수(function), 행위(behavior)

    객체지향 프로그래밍에서는 속성을 멤버변수로, 기능을 메서드로 표현한다.

     

    인스턴스 생성과 사용

    Tv tv; // (1)
    tv = new Tv(); // (2)

     

    (1) Tv 클래스의 참조변수 t 선언, 인스턴스는 생성되지 않음

    (2) Tv 클래스의 인스턴스가 메모리의 빈 공간에 생성된다. 대입연산자(=) 에 의해 생성된 인스턴스의 주소값이 참조변수 tv에 저장된다.

     

    인스턴스는 참조변수를 통해서만 다룰 수 있으며 참조변수의 타입은 인스턴스의 타입과 일치해야 한다.

     

    Tv tv1 = new Tv(); // (1)
    Tv tv2 = new Tv(); // (2)
    tv2 = tv1; // (3)

     

    (3) tv1이 저장하고 있던 인스턴스 주소를 tv2에 저장한다. 그렇게 되면 tv2는 tv1이 참조하고 있던 인스턴스를 같이 참조하게 되고, tv2가 원래 참조하고 있던 인스턴스는 더 이상 사용할 수 없게 된다.

    이 때 자신을 참조하고 있는 참조변수가 하나도 없는 인스턴스는 더 이상 사용될 수 없으므로 Garbage Collector에 의해 메모리에서 제거된다.

     

    참조변수에는 하나의 주소만이 저장될 수 있으므로 둘 이상의 참조변수가 하나의 인스턴스를 참조하는 것은 가능하지만 하나의 참조변수로 여러 개 인스턴스를 참조할 수 없다.

    객체 배열

    참조변수들을 하나로 묶은 참조 변수 배열

    Tv[] tvArr = new Tv[2]; // (1)
    tvArr[0] = new Tv(); // (2)
    tvArr[1] = new Tv(); // (3)

     

    (1) 길이가 2인 Tv 타입의 참조변수 배열 생성, 참조변수들이 만들어진 것 뿐이고 아직 객체가 저장되지 않아

    (2), (3) 처럼 객체를 생성해서배열의 각 요소에 저장해야 한다.

     

    클래스 - 사용자정의 타입

    객체지향언어에서는 클래스가 곧 사용자 정의 타입(user-defined type)이다.

    객체지향언어에스는 제어자와 메서드를 이요해서 추가적인 제약건들을 코드에 쉽게 반영할 수 있다.

     

    public class Person {
        private String name;
        private int age;
        private double weight;
        
        public int getAge(){
            return age;
        }
        public double getWeight(){
            return weight;
        }
        public void setAge(int age){
            if(age<1 || age >150) return;
            this.age = age;
        }
        public void setWeight(double weight){
            if(weight<0) return;
            this.weight = weight;
        }
    }

     

    제어자를 이용해서 변수의 값을 직접 변경하지 못하도록 하고 메서드를 통해서 유효성 검사를 하고 값을 변경하도록 작성할 수 있다.

     


    참고: 자바의 정석 - 남궁성

     

    🤞자바의 정석 스터디 1일차 p230-257🤞

    728x90

    댓글