본문 바로가기
Java

Class(1)-Class란 & Class 사용하기

by GGShin 2022. 4. 25.

1. Class 란?

Java는 OOP(Object-oriented Programming, 객체지향) 언어에 속합니다.

OOP 즉, 객체지향은 다수의 객체를 만들고 생성한 객체를 사용하여 프로그래밍을 하는 방법입니다. 객체란 실생활 용어로 사물이라고 생각하면 됩니다. 모든 사물이 각각의 특성과 행동(이 물건을 가지고 무엇을 할 수 있는지)을 가지고 있듯이, 각 객체 역시 고유한 특성, 행동과 같은 속성을 가집니다. 예를 들어서, "가방" 이라는 객체는 넓이, 높이, 색상과 같은 특성을 갖을 것이고 물건을 보관하고 물건을 옮기는 등의 행위를 할 수 있습니다. 프로그래밍 언어에서 사용되는 객체 역시 실생활에서 만나는 사물들처럼 독특한 특성과 행동 양상을 갖습니다.

 

객체지향이론은 발생하는 모든 사건들은 객체들 간의 상호작용을 통해 발생한다는 전제에서 출발하게 됩니다. 그래서 객체지향 프로그래밍은 프로그래밍에 필요한 데이터를 모아 추상화하여 상태(variable)와 행위(method)를 가진 객체(object)를 만들고, 그 객체들 간의 유기적인 상호작용을 통해 특정 기능을 구성합니다. 실제 사물의 속성과 기능을 분석하고 이를 컴퓨터 언어로 정의하고 구현하게 됩니다. 

 

*추가설명:
 A Java object is a member (also called an instance) of a Java class. Each object has an identity, a behavior and a state. 객체는 자바 클래스를 구성하는 (인스턴스라고 불리는) 멤버입니다. 
The state of an object is stored in fields (variables), while methods (functions) display the object's behavior. Objects are created at runtime from templates, which are also known as classes. 객체의 속성은 fields(variables)에 저장하고, 행동은 methods에 저장합니다.
https://www.techopedia.com/definition/24339/java-object#:~:text=A%20Java%20object%20is%20a,are%20also%20known%20as%20classes.

 

Class는 이런 object(객체)를 만들어 낼 수 있는 템플릿으로, 객체지향 프로그래밍의 핵심 중 하나 입니다.

사람에 빗대어 말하자면, Class는 인종, 성별, 나이 등 여러 속성에 상관없이 "사람" 이라는 하나의 템플릿 역할을 합니다. 

사람은 뇌가 있고, 머리가 있고, 몸이 있고, 팔, 다리 등등이 있습니다. 우리는 "사람" 템플릿을 이용해서 사람A, 사람B와 같이 여러 사람을 만들어 낼 수 있게 됩니다. 이때, 뇌, 머리, 몸통 등이 바로 objects의 state(상태)가 되겠고(fields에 저장) 먹고 자고 마시고와 같은 행동은 objects의 behavior가(methods에 저장) 될 것입니다.

"사람" 이라는 템플릿을 하나 만들어 두면 나중에 두고두고 사람C, 사람D,...를 만들때 사용하면 되니 참 편리합니다. Java에서도 Class라는 템플릿은 마찬가지의 역할을 합니다. Class를 이용해 만드는 object는 instance라고 부르기도 합니다. (명확이 구분하자면 object는 모든 instance를 포괄하여 지칭하고 instance는 특정한 클래스에서 생성된 객체를 지칭한다고 보면 됩니다.)

 

integer, double, long 등과 같은 primitive data type은 간편하기는 하지만 할 수 있는 것이 많지 않습니다. 각각에 맞는 타입의 데이터를 저장할 뿐입니다. 하지만 Class를 사용하면 특정 프로그래밍 작업에 필요한 fields나 methods를 상황에 맞게 만들어 사용할 수 있게됩니다.

 

IntelliJ에서 Java프로젝트를 자동 생성하면 

1
2
3
4
public class Main {
 
 
}
cs

매번 위와 같은 코드가 적혀있다는 것을 알 수 있는데, 이 역시도 바로 "Main" 이라는 하나의 class를 생성하는 것입니다.

 

2. Class 생성하기

어떻게 class를 만드는 지 한 번 알아보도록 하겠습니다. 먼저 Class에는 크게 4 가지 구성요소가 있는데, 각각 field, method, constructor 그리고 inner class 입니다. (Constructor와 inner class는 다른 포스팅에서 설명을 해두었으니 링크로 따라가서 보시면 됩니다.) 

Field는 위에서 언급하였듯이 객체의 상태를 정의하는 부분이고 method는 객체의 행동을 정의하는 부분입니다. 

Class를 생성할 때에는 public을 access modifier(접근제어자)로 사용합니다. 그래야 Main이나 기타 클래스에서 자유롭게 원하는 Class에 접근할 수 있기 때문입니다.

 

 

2-1.Fields 생성하기

반면에 Class 안에 정의하는 fields들은 private access modifier를 사용해서 해당 클래스 내부가 아닌 곳에서는 호출할 수 없게 제한을 해줍니다. (이를 encapsulation이라고 합니다.)

1
2
3
4
5
6
7
8
9
//class는 public하게 선언
public class Car {
    //fields는 private하게 선언
    private int doors;
    private int wheels;
    private String model;
    private String engine;
    private String colour;
}
cs

 

예시로 Car 라는 class(템플릿)를 만들었습니다. Car class에는 다섯개의 fields를 만들어 주었습니다.

이렇게 class를 만들면 Main class(혹은 다른 클래스도 됩니다.)로 가서 object(객체)를 만드는데 사용할 수 있습니다!

한 번 객체를 만들어 보겠습니다. 객체를 만들때에는 "new" 라는 keyword를 사용합니다. 데이터에 저장되어 있지 않은 새로운 친구니까 new라고 알려주는 거겠죠? new keyword는 생성된 객체를 힙 메모리에 넣어주는 역할을 합니다. 

 

1
2
3
4
5
6
7
8
public class Main {
    public static void main(String[] args) {
    
        //Car class(템플릿)을 이용하여 volvo라는 새로운 객체를 생성
        Car volvo = new Car();
 
    }
}
cs

Car class를 이용하여 volvo라는 새로운 객체를 탄생시켰습니다.

"사람" 템플릿을 이용해 사람A, 사람B,...를 만드는 것처럼 volvo 외에도 BMW, Hyundai 등 원한다면 여러 Car objects를 제작할 수 있습니다.

그리고 객체를 생성하면 Java에서는 자동으로 몇 가지 기능을 부여합니다. 한 번 확인해보기 위해 생성한 객체인 volvo에 이어 '.' 을 찍어보면, 여러가지 기능들이 이미 추가되어 있음을 알 수 있습니다. 이 기능들은 Java에서 자동으로 부여를 하는 것(Base Java class에서 Car class가 inherite 해 온 기능들입니다.)이고 우리가 원하는 기능을 만들 수도 있습니다. 

사실 아까전에 Car class에 다섯가지 fields를 생성하였는데 왜 저 기능 리스트에 보이지 않는 걸까요? 바로 그 fields는 private하게 만들어져있어서 다른 class에서 접근이 불가능하기 때문입니다. Public으로 바꾸어 준다면 접근이 가능해지지만 이는 encapsulation에 위배되므로 access modifier를 public으로 변경하지 않는 것이 좋습니다.

그렇다면 한번 Class에 저장된 속성은 객체에 따라 변경할 수 없을까요? 그렇지 않습니다. Fields 값을 바꾸려면 methods를 사용해주어 변경하면 됩니다. 

 

2-2.Methods 생성하기

 

Setter

이미 만들어 둔 다섯가지 fields에 값을 부여하려면 어떤 함수를 제작하면 하면 될까요? 

한 번 doors의 개수를 지정하는 함수를 만들어 보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Car {
    private int doors;
    private int wheels;
    private String model;
    private String engine;
    private String colour;
    
    //doors 필드의 값을 지정해 줄 수 있는 setDoors 함수 제작
    public void setDoors(int doors){
        this.doors = doors; //파라미터 값으로 들어갈 doors와 필드명 doors가 같으므로, 
                            //확실하게 지칭해주기 위해 필드명에 해당하는 doors는 앞에 this를 붙여준다.
    }
}
cs

 

setDoors 라는 함수를 만들었는데요, public으로 생성했기 때문에 다른 class에서도 접근이 가능합니다. 이런 식으로 보통 필드 값을 지정해주는 함수는 set***으로 시작합니다. (필수는 아닙니다.)

이렇게하면 다시 메인으로 돌아가서 volvo.을 사여 사용 가능한 methods를 보면 setDoors 함수가 리스트에 나오는 것을 확인할 수 있습니다.

나머지 네개의 필드도 set 함수를 제작해 주고 싶다면 직접 타이핑해도 되지만 command+N 을 눌러서 자동으로 setter(set 역할을 하는 함수)를 만들어 주면 편합니다. 

Command + N을 누르면 나오는 Generate에서 Setter를 선택하면,

아직 set함수가 만들어지지 않은 필드 목록이 나옵니다. Setter 제작을 원하는 필드를 모두 선택한 뒤에 OK를 누르면 자동으로 methods가 추가됩니다. 

다시 Main class로 와서 setDoors 함수를 써보면 아래 처럼 사용할 수 있습니다.

volvo 객체의 문의 갯수를 4개로 지정해보았습니다. 

만약에 지정할 parameter 값에 조건을 걸어두고 싶다면 어떻게 하면 될까요?

예를 들어서, volvo에 문을 0개(또는 음수 값)로 설정한다면 차를 사용할 수 없겠죠. 그렇다면 setDoors(0) (또는 음수 값)으로 된 경우에 문 개수가 유효하지 않다고 알려주어야 할 것입니다. 이런 식의 조건을 두고 싶다면 Car class에서 해당 method를 수정해주면 됩니다. 

1
2
3
4
5
6
7
public void setDoors(int doors){
    if(doors < 0) {
       System.out.println("Invalid number of doors. Please set bigger than 0.");
    } else {
       this.doors = doors;
    }
}
cs

doors 값에 0 이하 값이 들어왔을 때는 0보다 큰 수를 넣으라는 메세지를 print out하게 하고, 그 외의 정수가 들어왔을 때는 정상적으로 값이 적용되도록 예외처리를 해주었습니다.

 

setModel() method도 만들어 보았습니다.

1
2
3
4
5
6
7
8
   public void setModel(String model){
        String validModel = model.toLowerCase();
        if(validModel.equals("xc90") || validModel.equals("xc60")) {
            this.model = model;
        } else {
            this.model = "Unknown";
        }
    }
cs

setModel에서는 모델이 "xc90" 또는 "xc60"인 경우에만 값을 적용하고 나머지 값이 들어왔을 때는 Unkown이라는 메세지를 print out 하게 작성하였습니다. 

여기서 사용된 .equals는 String type의 값을 비교할 때 사용되는 함수입니다. "=="와는 다른데, 다음에 한 번 더 알아보도록 하겠습니다.

 

Getter

위에는 setter methods였는데, return 값을 갖는 getter methods도 마찬가지 방법으로 만들 수 있습니다.

Car class로 돌아와서 getModel() method를 만들었습니다.

get 역시 set 처럼 command+N으로 자동으로 생성할 수 있습니다. 

 

getter를 사용하면 fields 값들을 이용할 수 있게 됩니다. private으로 정의한 fields의 값들을 class 외부에서도 사용할 수 있게도 해주고 (물론 getter 자체는 public이어야 되겠죠?), class 내부에서도 필요한 때에 사용할 수 있게 됩니다. 

 

Class의 기본적인 내용에 대하여 알아봤는데,

다음번에는 setter를 좀 더 편리하게 해주는 constructor에 대해서 살펴보겠습니다.

감사합니다.☺️

반응형

'Java' 카테고리의 다른 글

Class(3)-Inheritance(상속) 사용하기  (0) 2022.04.25
Class(2)-Constructor-set을 간편하게  (4) 2022.04.25
User Input 받는 방법 - Scanner사용  (0) 2022.04.22
Switch문  (0) 2022.04.18
축약 연산자 (operator abbreviation)  (0) 2022.04.09