Java

Java - 객체 개념과 클래스의 기본적인 모습

비뀨_ 2022. 3. 5. 05:12

객체 지향 프로그래밍이 무엇인가?

객체 지향 프로그래밍의 의미를 알기 위해 우선 단어들을 뜯어보자.

 

먼저, 객체물리적으로 존재하거나, 추상적으로 생각할 수 있는 것 중에서 속성을 갖고 식별할 수 있는 것을 말한다.

예를들어 식별이 가능 한 것으로는 물리적인 것으로 자동차, 사람, 등이 있을 수 있다.  

추상적으로는 학과, 주문, 배송지 등 실체는 없지만 식별이 가능한 것들이 있다.

 

객체는 속성 + 동작으로 이뤄져 있다.

예를 들어보면 

사람은 이름, 키,몸무게 등의 속성이 있고, 걷거나 뛰고 웃고 우는 등의 동작을 할 수 있다.

자동차는 제조사, 모델명, 색상 등의 속성이 있고,  가속 감속 기어변속 등의 동작을 할 수 있다.

 

Java에서는 속성필드(field)라고 하고, 동작메소드(method)라고 한다.

위의 사람을 예를 들어서 간단하게 사람 객체를 만들어 보면 다음과 같다.

이렇게 현실의 객체를 소프트웨어 객체로 설계하는 것을 객체 모델링이라고 한다.

 

 

그럼 왜 객체를 사용할까? 객체로 뭘 할까 생각해보자

객체를 만드는 가장 큰 이유는 상호작용을 위해서라고 생각한다.

위에서 사람의 객체를 만들었는데, 객체와 객체는 상호작용을 할 수 있다.

다시 사람과 자동차를 예를 들어보자.

사람은 자동차의 시동을 켜고 자동차는 이동속도를 보여주거나 목적지로 데려다 준다.

이렇게 객체 간의 상호작용을 통해 원하는 결과를 돌려줄 수 있다.(Java에서 return 키워드 - 나중에 보면 알 수 있다.)

 

객체 사이의 상호작용 수단은 메소드를 통해 이뤄진다.

기초 자동차 클래스

위처럼 메소드를 호출해서 결과 값을 받을 수 있다.

 

객체의 관계

객체는 집합, 사용, 상속 관계가 있다.

  • 집합 : 객체는 하나의 부품이고, 하나는 완성품이다.
    • 자동차는(완성품) 엔진, 타이어, 핸들 등(부품)으로 이루어져 있다.
  • 사용 : 객체 간 상호작용
    • 사람은 자동차를 사용한다와 같이 어떤 객체가 어떤 객체를 사용할 때
  • 상속 : 부모 객체를 가진 자식 객체
    • 고양이, 강아지, 사자 등(자식 객체)은 동물(부모 객체)이라는 상위 개념에서 파생되었다.

 

클래스의 개념

클래스객체의 설계도라고 할 수 있다.

객체를 만들 때에는 클래스인스턴스화 해서 객체를 생성하게 된다.

 

보통 연필을 만들 때 현실에서는 공장에서 연필의 규격을 정의하는 설계도가 있고, 공장에서는 그 규격대로 연필을 만든다. 프로그래밍에서도 그렇다고 생각하면 될 것 같다.

 

다른 예로 배울 때 한번씩 볼 수 있는 예시가 있는데 바로 클래스는 붕어빵 틀, 객체는 붕어빵이라는 예시이다.

붕어빵을 만들 때 밀가루반죽과 팥을 붕어빵 틀에 채우고, 붕어빵 굽는 과정을 통해 붕어빵이 만들어진다.

  • 붕어빵틀 : 클래스
  • 붕어빵 재료 : 필요한 매개변수 등 ( 나중에 차차 알아가게 됨 넣어주는 재료들이라고 생각하면 된다.)
  • 붕어빵 굽기 : 인스턴스 화

붕어빵 틀만 있으면 붕어빵 틀이 닳아 없어질 때까지 붕어빵을 찍어낼 수 있다.

(물론 프로그래밍에서는 클래스 사용한다고 닳아 없어지지 않음)

 

클래스 생성 방법

 

클래스

위에서도 봤었듯 클래스는 이렇게 생겼다.

Java에서 클래스를 생성할 때 작명규칙이 있다

  1. 하나 이상의 문자로 이루어져야한다.
  2. 영어로 작성하고, 첫글자는 대문자이어야한다.(한글 등도 되지만 관례는 따라야 한다. 규칙이라고 생각하면 됨)
  3. 숫자도 이름에 들어갈 수 있지만 첫글자에는 들어갈 수 없다.  ex) 2Car  (X)
  4. $ _ 외의 특수문자는 사용할 수 없다.
  5. 자바에서 지정한 예약어라는게 있는데 그것들은 사용 불가     ex) int , String return 등등 여러가지 예약어

위의 것들은 사용하다보면 자연스럽게 알 수 있기 때문에 굳이 외울 필요는 없다.

 

Car라는 이름의 클래스를 만들면 아래와 같이 만들어진다.

public class Car{
	//코드
}
class Handle{
	//코드
}

Handle이란 클래스는 임의로 하나의 파일에서 두개의 클래스도 생성 될 수 있다라는 것을 보여주기 위해 작성했다.

클래스를 한개 만들게 되면 public  + class + 클래스이름이 있는데

 

public은 접근제한자라는 것이고 ( 궁금하면 구글링을 해보자)

class는 이건 클래스다라는 것이고

클래스이름은 이 클래스의 이름표라는 뜻이다.

 

클래스의 구성 요소

객체는 속성과 동작으로 이루어져있다고 했다.

그럼 클래스는 뭘로 이루어졌을까??

 

클래스는 필드 , 생성자 , 메소드로 이루어져 있다.

  • 필드 : 객체의 고유 데이터를 저장하는 곳.
  • 생성자 : new 연산자를 쓰면 호출되는 부분. 객체를 만들 때 객체의 초기화를 담당한다.
  • 메소드 : 동작을 수행하는 것. 객체 간의 데이터를 전달하는 수단.
public class Car{
  //필드
  int a; 
    
  //생성자
  Car(){
  	//코드
  }
  //메소드
  public void drive(){
  	//코드
  }

}

 

위를 쭉 보다가 내려온 사람은 의문을 가질 수 있다.

 

"어..? 저 위에는 생성자라는거 없었는데...?"

 

맞다. 없었다. 그러면 없어도 되는건가?? 답은 아니다.

생성자는 너무 필요해서 기본적인거라 생략하면 자동으로 바로 위처럼 아무것도 없는 빈 생성자를 만들어준다.

 

 

객체 생성

위에서 붕어빵이 객체이고 붕어빵을 굽는 행위가 인스턴스화라고 했는데

붕어빵(객체)를 어떻게 굽냐(어떻게 객체로 만드냐)면

new라는 연산자를 쓰면 된다.

Car car = new Car(); //car 객체 쓸 수 있게 준비.
클래스이름 부를이름 = new 클래스이름();

위에서도 한번 나왔지만 new라는 키워드를 작성한 뒤 클래스 이름을 붙이면 객체를 생성하고 사용할 준비를 한다.