본문 바로가기
> 개발/JAVA

자바의 객체와 클래스

by @일리 2023. 7. 23.

자료형의 종류

1. 기본자료형 : 정수형, 실수형, 문자형, 논리형

2. 사용자정의 자료형

 

정수, 실수, 문자, 불린형 타입의 데이터를 저장하기 위해서 데이터 타입을 어떻게 선언해야 하는지는 알고 있다. 하지만 숫자형과 문자형, 논리형과 같은 단일 성격을 가진 데이터가 아니라, 여러 값의 조합으로 이루어진 데이터를 저장하려면 어떻게 해야 할까? 자바에도 C언어의 구조체 또는 자바스크립트에서의 객체와 같은 형태의 데이터가 있을까?

 

자바에도 객체가 있다. 객체는 여러 개의 구조(성격)로 이루어진 데이터이다. 자바에서는 객체 데이터를 만들기 위해서 클래스로 새로운 자료형을 만들어야 한다. 다시 말해 클래스란 객체를 만드는 도구이다.

새로운 자료형 만들기

Car 라는 자료형을 만들어보자. 자동차와 관련된 데이터에는 '제조사', '모델 이름', '휘발유 타입 여부', '제조년도' 등이 있다. 그러니까 Car를 이루는 데이터에는 숫자가 있을 수도 있고, 문자, 불린이 있을 수도 있다. Car를 나타내기 위해서 Class를 이용해서 객체를 만들어보자.

public class Car {
    public String model;
    public int price;
    public String make;
    public int year;
    public boolean isGasolineModel;

    public void introduce() {
        System.out.println("제 차는 " + this.year + "년식 " + this.model + "입니다.");
    }
}

Class를 만들 때 변수의 타입을 정할 수 있을 뿐만 아니라 매소드도 만들 수 있다. Car 내부에 있는 model, price, make 등은 속성, 멤버변수, 프로퍼티라고 부른다. 속성 앞에 붙은 public은 무엇을 의미할까? 다른 것으로 대체해서 작성할 수도 있을까?

접근제어자

자바는 객체지향 언어다. 객체지향 언어의 특성에는 상속, 다형성, 캡슐화, 추상화 등이 있다. public은 접근제어자이고, 접근제어자는 이중 캡슐화(특정 객체의 속성과 기능을 캡슐로 만들어 외부로부터 데이터를 보호)와 관련이 깊은 개념이다. 접근제어자에는 public, private, protected, package-private이 있다. 어떤 접근제어자를 사용했는지에 따라서 코드에 접근할 수 있는 권한이 달라진다.

 

1. Public: 모든 클래스 또는 패키지에서 액세스할 수 있음

2. Private: 같은 클래스 내에서만 액세스할 수 있음. 다른 클래스, 심지어 하위 클래스에서도 액세스할 수 없음

3. Protected : 동일한 패키지 내의 동일한 클래스, 하위 클래스 및 클래스 내에서 액세스 가능. 다른 패키지의 클래스에서는 액세스 불가

4. Package-private(기본값): 동일한 패키지 내에서 액세스할 수 있지만 다른 패키지의 클래스에서는 액세스할 수 없음

 

아직은 접근제어자가 어떤 의미인지 와닿지 않는다. 자바 학습 초반이라 개념 정도만 이해하고 다음으로 넘어가장!! 이제 Car 클래스를 만들었으니 myCar를 Car 클래스를 적용해서 만들어보자!

public class CarPractice {
    public static void main(String[] args) {
        Car myCar = new Car(); // 📌 변수를 선언하고 새로운 객체를 생성(인스턴스:instance)해서 연결

        myCar.model = "Morning";
        myCar.price = 2000;
        myCar.make = "KiA";
        myCar.year = 2023;
        myCar.isGasolineModel = true;

        myCar.introduce();
    }
}

// 제 차는 2023년식 Morning입니다.

new = 생성 연산자, Car() 생성 매소드를 사용하면 Car 클래스로 myCar라는 객체를 만들 수 있다. 생성한 myCar 객체의 속성을 할당하고 싶을 때는 .(도트 연산자, 참조 연산자)를 이용해서 속성에 접근한다. Car class를 만든 덕분에 계속해서 차량 정보가 들어있는 객체를 반복적으로 만들 수 있다. 

 

클래스와 관련해서 알아야 할 개념들이 몇 가지가 있다. 클래스와 객체, 인스턴스다.

 

1. 클래스(Class) : 객체를 만들기 위한 템플릿, 설계도이다. 클래스의 객체가 갖게 될 구조(속성, 필드)나 동작(매서드)을 정의한다.

  1) 필드 : 객체의 데이터 또는 상태를 저장

  2) 생성자 : 객체가 생성될 때 객체 상태를 초기화하는 데 사용한다. new 생성자를 클래스 이름 앞에 붙여 호출한다.

  3) 매서드 : 객체의 동작 또는 작업을 정의하는 함수

2. 객체(Object) : 클래스로 생성된 인스턴스이다. 매서드를 호출하거나 속성을 조작할 수 있다. 고유의 속성을 갖고 있기 때문에 다른 객체들과 식별 가능하다.

3. 인스턴스(Instance) : 클래스를 이용해 생성된 객체 하나하나를 의미한다. 객체와 같은 의미로 사용되기도 한다. new 생성자로 myCar객체를 생성할 때, 힙 영역에 새로운 클래스의 인스턴스가 생긴다. 

궁금한 점

public class MemberTest {
    public static void main(String[] args) {
        Member hong = new Member();
        hong.name = "홍길동";
        hong.age = 30;
        hong.number = "010-1111-1111";
        hong.email = "fc@naver.com";
        hong.address = "서울";
        hong.weight = "57.6kg";

        System.out.println(hong);
    }
}

자바스크립트에서 console.log(hong)을 하면 {name : '홍길동', age : 30, number : "010-1111-1111"...} 이런 식으로 출력이 될 것이다. 자바에서도 그런 걸 기대하고 System.out.println(hong)을 했는데 출력된 결과는 Member@2d209079 이다. 이게 뭐람?! 챗지피티 선생님에게 물어보니 '객체를 직접 인쇄하면 객체의 클래스 이름 뒤에 "@" 및 객체의 해시 코드가 16진수로 표시됩니다. 표시된 출력(Member@2d209079)은 Java의 모든 클래스의 상위 클래스인 Object 클래스에서 제공하는 toString() 메서드의 기본 동작입니다.' 라고 한다. 

 

그렇다면 자바스크립트의 객체 형태로 출력하려면 자바에서 어떻게 해야 하는지 물어봤다. 돌아온 답변은

// 1번
import java.util.logging.Logger;

Logger logger = Logger.getLogger(MemberTest.class.getName());
logger.info("Name: " + hong.name);
logger.info("Age: " + hong.age);
logger.info("Number: " + hong.number);
logger.info("Email: " + hong.email);
logger.info("Address: " + hong.address);
logger.info("Weight: " + hong.weight);

// 2번
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("Name: ").append(hong.name).append("\n");
stringBuilder.append("Age: ").append(hong.age).append("\n");
stringBuilder.append("Number: ").append(hong.number).append("\n");
stringBuilder.append("Email: ").append(hong.email).append("\n");
stringBuilder.append("Address: ").append(hong.address).append("\n");
stringBuilder.append("Weight: ").append(hong.weight).append("\n");

String result = stringBuilder.toString();
System.out.println(result);

// 3번
String result = String.format("Name: %s\nAge: %d\nNumber: %s\nEmail: %s\nAddress: %s\nWeight: %s\n",
    hong.name, hong.age, hong.number, hong.email, hong.address, hong.weight);

System.out.println(result);

이렇게 하라고 한다. 그나마 3번이 간결해보인다.... 정말 이렇게 불편한 방법밖에 없는건지 궁금하다🥹

댓글