클래스, 객체, 인스턴스

박영준·2022년 11월 25일
0

Java

목록 보기
1/111

1. 클래스

1) 정의

  • 설계도

  • 필드(객체를 생성)와 메소드가 정의되어 있음

  • 객체를 정의해 놓은 것

    • 객체를 생성하는데 사용한다.

2) 클래스의 생성

  • 원하는 타입을 직접 만들 수 있다.

예시 1

사용자 3명의 시간을 기록하고자 한다.

(1) 클래스 사용을 하지 않고 관리하는 방법

class NoneClassTime {
    public static void main(String[] args) {
    
        // 총 3명 의 시간을 변수로 관리
        int hour1, hour2, hour3;
        int minute1, minute2, minute3;
        int second1, second2, second3;

        // 총 3명 의 시간을 배열로 관리
        int[] hour = new int[3];
        int[] minute = new int[3];
        int[] second = new int[3];
    }
}

(2) 클래스로 만들어서 관리하는 방법

시간을 다루는 타입을 직접 만들고 싶다면, 기본형 8개가 아닌 새로운 타입인 시간 클래스를 작성하면 된다.

class Time3_1 {
    int hour;
    int minute;
    int second;
}

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

하나의 소스파일에 여러개의 클래스를 정의할 수도 있다.

올바른 사용

// 1
소스 파일 : Hello2.java
클래스 : public class Hello2 {}
클래스 :        class Hello3 {}

// 2
소스 파일 : Hello2.java
클래스 :        class Hello2 {}
클래스 :        class Hello3 {}
  • 1 : public class 가 있을 경우, 소스파일 이름은 반드시 public class 이름과 일치해야 함
  • 2 : public class 가 하나도 없을 경우, 소스파일 이름은 아무 이름이나 상관없음

잘못된 사용

// 1
소스 파일 : Hello2.java
클래스 : public class Hello2 {}
클래스 : public class Hello3 {}

// 2
소스 파일 : Hello3.java
클래스 : public class Hello2 {}
클래스 :        class Hello3 {}

// 3
소스 파일 : hello2.java
클래스 : public class Hello2 {}
클래스 :        class Hello3 {}
  • 1 : public class 가 둘 이상 존재한다
  • 2 : 소스파일 이름은 public class의 이름과 일치해야 한다
  • 3 : 소스파일 이름은 public class의 이름과 일치해야 한다 (대소문자까지)

3) 명명 규칙

(1) 공통 명명 규칙

  1. 숫자로 시작 X

  2. 언더바( _ ), $ 만 사용 O (다른 특수문자 X)

  3. 대소문자 구분 필요

  4. 예약어 X

(2) 클래스 명명 규칙

  1. 대문자 & 명사 로 시작

  2. 두 번째 단어부터는 대문자로 시작하는 것을 권장.
    (소문자도 가능은 하다)

4) 클래스의 구성 멤버

package test2;

public class ClassName {

    // 필드
    int fieldname;

    // 생성자
    ClassName() {
        ...
    }

    // 메소드
    void methoName() {
        ...
    }
}

필드(Field)
- 객체의 데이터 저장
- 생성자와 메소드 전체에서 사용됨
- 객체가 소멸되지 않는 한, 객체와 함께 존재 (필드는 변수가 아님!)

생성자(Construction)
- 객체 생성 시, 초기화 담당
- new 연산자로 호출됨
- 클래스 이름과 동일함
- 리턴 타임 없음!
- 모든 클래스에 반드시 1개 이상 존재

메소드(Method)
- 객체의 동작에 해당
- 실행 블록
- 메소드를 호출하면, { } 중괄호 블록 내의 모든 코드들이 일괄적으로 실행됨
- 객체 간 데이터 전달하는 수단: 외부(호출한 곳)로부터 매개값 받아 실행에 이용 --> 실행후, 결과 값을 외부(호출한 곳)로 리턴할수도 있음

5) 클래스 선언

(1) 작성자 식별 규칙

  1. 하나 이상의 문자: Car, SportsCar

  2. 첫글자에 숫자 : 3Car (X)

  3. 특수문자 중 $, _ 만 가능 : @Car, #Car (X)

  4. 자바 키워드 : int, for (X)

  5. 첫 글자는 대문자, 나머지는 소문자

  6. 각 단어의 첫 글자는 대문자

(2) 소스 파일

// 클래스 이름.java 로 소스파일 생성
public class Car {		// Car.class 생성

}

class Tire {		// Tire.class 생성

}
  1. 소스 파일 이름 = 클래스 이름

  2. public class 는 소문자

  3. { } 는 클래스 선언의 시작, 끝을 알림

  4. 2개 이상의 클래스 선언도 가능

6) 클래스의 용도

  1. 라이브러리 용

    • 다른 클래스에서 이용할 목적으로 설계
  2. 실행용

    • 여러개의 클래스 中 단 1개가 실행 클래스
    • main() 메소드를 제공(프로그램 실행 진입점)

7) 클래스로부터 객체 생성

// StudentExample: 클래스 --> 클래스는 1개
public class StudentExample {
	/ /main() 메소드를 사용해서, 라이브러리 + 실행 클래스로 만들 수도 있음
    public static void main(String[] args) {

        // new 연산자를 이용하여, 객체 생성 (이 객체는 Student 클래스의 인스턴스) --> new 연산자로 생성된 객체는 메모리 힙 영역에 생성됨
        // Student 클래스는 1개 일지라도, new 연산자를 사용한 만큼 객체가 메모리에 생성됨
        // S1과 S2와 s3이 참조하는 Student 객체는 완전히 독립된 서로 다른 객체

        // 클래스 변수 선언, 객체 생성을 따로 한 경우
        Student s1;
        s1 = new Student();
        System.out.println("s1 변수가 Student 객체를 참조합니다.");

        // 클래스 변수 선언, 객체 생성을 1개의 실행문에 한 경우
        student s2 = new student();
        System.out.println("s2 변수가 다른 Student 객체를 참조합니다.");

        Student s3 = new Student();
        System.out.println("s3 변수가 또 다른 Student 객체를 참조합니다.");
    }
}

8) 클래스 간 '포함 관계' 맺기

  • 상속 이외에 클래스를 재사용하는 방법 中 하나

  • 한 클래스를 작성할 때, 다른 클래스를 멤버 변수로 선언하여 포함시킴

기존 코드

Circle 클래스

class Circle {
	inx x;
    int y;
    int r;
}

Point 클래스

class Point {
	int x;
    int y;
}

포함 관계 코드

Circle 클래스

class Circle {
	Point c = new Point();		// int x 와 int y
    int r;
}

Point 클래스

class Point {
	int x;
    int y;
}
  • Point 클래스를 재사용해서 → Circle 클래스를 작성

9) 내부 클래스 (inner class)

참고: 내부 클래스 (inner class)

2. 객체

1) 정의

// Calcurator: 객체
// add: 메소드
// 10, 20: 매개값
int result = Calcurator.add(10, 20);	//return한 값을 int 변수인 result에 저장
  • 클래스(= 설계도)를 바탕으로 만든 완성품

  • 객체들은 각각 독립적으로 존재 + 다른 객체와 상호작용하면서 동작
    → 객체들 사이의 상호작용 수단? 메소드
    → 객체가 다른 객체의 기능을 이용하는 것? 메소드 호출

  • 실제로 존재하는 것

    • 사물 or 개념
    • 객체가 가지고 있는 속성과 기능에 따라 그 용도가 달라진다.
  • 객체의 구성요소

    • 속성 (= 변수)

      • 자동차 회사, 모델, 색상, 가격, 속도
    • 행위 (= 메서드)

      • 자동차 가속, 브레이크, 기어 변속, 조명, 경적
  • out 또한 println 메소드를 가지는 객체다.

    System.out.println("Hello world!");
  • 객체 모델링

    • 현실 세계에 있는 객체를 소프트웨어의 객체로 설계하는 것
  • 객체 간의 협력 (사람 객체, 자동차 객체가 있을 때)

    • 사람이 자동차 가속 폐달 밟음 -> 자동차 속도 증가하며 이동
    • 사람이 자동차 브레이크 밟음 -> 자동차 속도 감소하며 정지
  • 객체는 메서드를 통해서 데이터를 주고받을 수 있다.

  • 클래스에 필드를 정의해서 선언했다고 해서 바로 사용할 수 있는 것은 X

    • 클래스는 설계도일 뿐, 실제로 필드의 데이터를 가지고 있는 것은 '객체'
      • 따라서, 객체를 생성한 후, 필드를 사용할 수 있다
        참고: 필드

2) 객체 생성

(1) 문법

/* 문법 */
// 1. 클래스의 객체를 참조하기 위한 참조변수(변수명)를 선언
클래스명 변수명;

// 2. 생성된 객체의 주소를 참조변수에 저장
변수명 = new 클래스명;

(2) 객체 생성 & 참조형 변수

Car 클래스

public class Car {

	// 필드
    ...

	// 기본 생성자
    public Car() {
    }

    // 메소드
    ...

Main 클래스

public class Main {
    public static void main(String[] args) {
    
    	// 참조형 변수
        Car car1 = new Car();   // Car클래스의 객체인 car1 인스턴스 생성
        Car car2 = new Car();   // Car클래스의 객체인 car2 인스턴스 생성
        
        ...
    }
}
  • main 클래스를 실행하면
    • Car 클래스를 호출하게 된다.
      • new 연산자를 통해서 객체가 생성되면 해당 인스턴스의 주소가 반환

(3) 객체 배열

  • 여러 개의 객체를 담을 수 있는 배열
    Car 클래스
public class Car {

	// 필드
    ...
    double speed;  	// 자동차 속도 , km/h
    char gear; 		// 기어의 상태, P,R,N,D
    boolean lights; // 자동차 조명의 상태

	// 기본 생성자
    public Car() {} 

	// 메소드
    double gasPedal(double kmh) {
        speed = kmh;
        return speed;
    }

    char changeGear(char type) {
        gear = type;
        return gear;
    }

   ...
}

Main 클래스

public class Main {
    public static void main(String[] args) {
        Car[] carArray = new Car[3];	// 배열 생성
        Car car1 = new Car();			// Car 클래스 호출 (car1 인스턴스 생성)
        car1.changeGear('P');			// Car 클래스에 선언된 changeGear() 메소드 실행해서, 필드 gear 값을 'P' 로 바꾼다
        carArray[0] = car1;				// car1 을 생성한 배열에 넣기
        
        Car car2 = new Car();			// car2 인스턴스 생성
        car2.changeGear('N');
        carArray[1] = car2;
        
        Car car3 = new Car();			// car3 인스턴스 생성
        car3.changeGear('D');
        carArray[2] = car3;

        for (Car car : carArray) {
            System.out.println("car.gear = " + car.gear);
        }
    }
}

/* 출력 결과
car.gear = P
car.gear = N
car.gear = D
*/

3) 객체 사용

class Tv1_1 {
    // 속성 : 변수 선언
    String color; // 색깔
    boolean power = false; // 전원상태 : false 로 초기화
    int channel = 1;  // 채널 : 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(); // TV1 인스턴스
        t1.color = "검정색"; // 색깔 초기화
        
        Tv1_1 t2 = new Tv1_1(); // TV2 인스턴스
        t2.color = "흰색"; // 색깔 초기화

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

        t1.power(); // 메서드 호출
        System.out.println("TV1 인스턴스 채널 = " + t1.channel);

        t1.channelUp(); // 메서드 호출
        System.out.println("TV1 인스턴스 채널 : " + t1.channel);
        t1.channelDown(); // 메서드 호출
        System.out.println("TV1 인스턴스 채널 : " + t1.channel);

        t1.power(); // 메서드 호출


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

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

        // 흰색이었던 TV2 인스턴스 의 색깔이 검정색으로 바뀐건가요?
        // 아닙니다.
        // 참조변수 t2 에 저장되어있던 TV2 인스턴스 의 주소가 없어지고
        // TV1 의 주소가 t2 참조변수에 저장이 됩니다

        // 따라서 t2 = t1; 이후 부터는
        // t2 참조변수로는 더 이상 TV2 인스턴스 에 접근할 수 없습니다.

    }
}

4) 객체 간의 관계

집합 관계

자동차(완성품) - 엔진, 타이어, 핸들(부품)

사용 관계

사람 - 자동차 (사람은 자동차를 사용할 때, 메소드(달린다, 멈춘다 등...)를 사용)

상속 관계

상위(부모) 객체(종류, 기계) - 하위(자식) 객체(구체적인 사물, 자동차)

5) 객체 배열

  • 주의해야 할 점은
    • 참조변수가 만들어졌을 뿐
    • 아직 객체가 저장된 것은 아님

예시 1

Tv[] tvArr = new Tv[3]		// 객체 배열 생성
tvArr[0] = new Tv();		// 객체 생성 + 배열에 저장
tvArr[1] = new Tv();
tvArr[2] = new Tv();

예시 2

Tv[] tvArr = {new Tv(), new Tv(), new Tv()}
  • 예시 1 을 다음처럼 간단히 표현하기도 함

예시 3

Tv[] tvArr = new Tv[100]

for (int i = 0; i < tvArr.length; i++) {
	tvArr[i] = new Tv();
}
  • for문으로 표현하기도 함

3. 인스턴스(instance)

1) 정의

  • 클래스로부터 만들어진 객체

    • 클래스를 토대로 생성된 객체
  • 자동차(클래스) -- 자동차(객체): 자동차(객체)는 자동차(클래스)의 인스턴스

  • 인스턴스화

    • 클래스로부터 객체를 만드는 과정
    • 클래스 -> 인스턴스(객체)
  • 동일한 클래스로 여러 개의 인스턴스를 만들 수 있다


4. 비교

1) 클래스(Class) VS 객체(Object)

클래스 : ‘객체를 만들기 위한 설계도’

객체 : ‘설계도를 바탕으로 만든 완성품’

2) 인스턴스(Instance) VS 객체(Object)

  • 인스턴스 : 자동차 클래스를 통해 만들어진 하나의 자동차
    객체 : 여러 개의 인스턴스들을 크게 통틀어서 자동차 객체

인스턴스

  • 클래스의 타입으로 선언되었을 때 '객체'라고 부르고,
    그 객체가 메모리에 할당되어 실제 사용될 때 '인스턴스'라고 부른다.

  • 특정 클래스로부터 생성된 객체 (Tv 클래스를 사용해서 만든 Tv인스턴스)

  • 소프트웨어 세계에 가깝다.

  • ‘관계’에 초점을 맞춘다.

객체

  • ‘클래스의 인스턴스’라고도 부른다.

  • 모든 인스턴스를 대표하는 일반적인 용어 (Tv 객체)

  • 현실 세계에 가깝다.

  • ‘실체’에 초점을 맞춘다.

주의!
의미를 부여하는 것일 뿐 엄격하게 객체와 인스턴스를 나누긴 어렵다.


용어

  • 객체 모델링(object modeling): 현실 세계의 객체를 소프트웨어 객체로 설계하는 것
  • 매개값: 메소드를 실행하기 위해 필요한 데이터
  • 리턴값: 메소드가 실행되고 난 후, 호출한 곳으로 돌려주는(return하는) 값
  • 객체 지향 프로그래밍
    - 만들고자하는 객체를 모델링하고
    - 집합 관계에 있는 객체와 사용 관계에 있는 객체를 하나씩 설계한 후,
    - 조립하는 방으로 프로그램을 개발하는 기법

참고: [JAVA] 구조 개념 및 명명 규칙
참고: [Java] 클래스, 객체, 인스턴스의 차이

profile
개발자로 거듭나기!

0개의 댓글