객체 지향 프로그래밍이 무엇인가?
객체 지향 프로그래밍의 의미를 알기 위해 우선 단어들을 뜯어보자.
먼저, 객체는 물리적으로 존재하거나, 추상적으로 생각할 수 있는 것 중에서 속성을 갖고 식별할 수 있는 것을 말한다.
예를들어 식별이 가능 한 것으로는 물리적인 것으로 자동차, 사람, 책 등이 있을 수 있다.
추상적으로는 학과, 주문, 배송지 등 실체는 없지만 식별이 가능한 것들이 있다.
객체는 속성 + 동작으로 이뤄져 있다.
예를 들어보면
사람은 이름, 키,몸무게 등의 속성이 있고, 걷거나 뛰고 웃고 우는 등의 동작을 할 수 있다.
자동차는 제조사, 모델명, 색상 등의 속성이 있고, 가속 감속 기어변속 등의 동작을 할 수 있다.
Java에서는 속성을 필드(field)라고 하고, 동작을 메소드(method)라고 한다.
위의 사람을 예를 들어서 간단하게 사람 객체를 만들어 보면 다음과 같다.
이렇게 현실의 객체를 소프트웨어 객체로 설계하는 것을 객체 모델링이라고 한다.
그럼 왜 객체를 사용할까? 객체로 뭘 할까 생각해보자
객체를 만드는 가장 큰 이유는 상호작용을 위해서라고 생각한다.
위에서 사람의 객체를 만들었는데, 객체와 객체는 상호작용을 할 수 있다.
다시 사람과 자동차를 예를 들어보자.
사람은 자동차의 시동을 켜고 자동차는 이동속도를 보여주거나 목적지로 데려다 준다.
이렇게 객체 간의 상호작용을 통해 원하는 결과를 돌려줄 수 있다.(Java에서 return 키워드 - 나중에 보면 알 수 있다.)
객체 사이의 상호작용 수단은 메소드를 통해 이뤄진다.
위처럼 메소드를 호출해서 결과 값을 받을 수 있다.
객체의 관계
객체는 집합, 사용, 상속 관계가 있다.
- 집합 : 객체는 하나의 부품이고, 하나는 완성품이다.
- 자동차는(완성품) 엔진, 타이어, 핸들 등(부품)으로 이루어져 있다.
- 사용 : 객체 간 상호작용
- 사람은 자동차를 사용한다와 같이 어떤 객체가 어떤 객체를 사용할 때
- 상속 : 부모 객체를 가진 자식 객체
- 고양이, 강아지, 사자 등(자식 객체)은 동물(부모 객체)이라는 상위 개념에서 파생되었다.
클래스의 개념
클래스는 객체의 설계도라고 할 수 있다.
객체를 만들 때에는 클래스를 인스턴스화 해서 객체를 생성하게 된다.
보통 연필을 만들 때 현실에서는 공장에서 연필의 규격을 정의하는 설계도가 있고, 공장에서는 그 규격대로 연필을 만든다. 프로그래밍에서도 그렇다고 생각하면 될 것 같다.
다른 예로 배울 때 한번씩 볼 수 있는 예시가 있는데 바로 클래스는 붕어빵 틀, 객체는 붕어빵이라는 예시이다.
붕어빵을 만들 때 밀가루반죽과 팥을 붕어빵 틀에 채우고, 붕어빵 굽는 과정을 통해 붕어빵이 만들어진다.
- 붕어빵틀 : 클래스
- 붕어빵 재료 : 필요한 매개변수 등 ( 나중에 차차 알아가게 됨 넣어주는 재료들이라고 생각하면 된다.)
- 붕어빵 굽기 : 인스턴스 화
붕어빵 틀만 있으면 붕어빵 틀이 닳아 없어질 때까지 붕어빵을 찍어낼 수 있다.
(물론 프로그래밍에서는 클래스 사용한다고 닳아 없어지지 않음)
클래스 생성 방법
위에서도 봤었듯 클래스는 이렇게 생겼다.
Java에서 클래스를 생성할 때 작명규칙이 있다
- 하나 이상의 문자로 이루어져야한다.
- 영어로 작성하고, 첫글자는 대문자이어야한다.(한글 등도 되지만 관례는 따라야 한다. 규칙이라고 생각하면 됨)
- 숫자도 이름에 들어갈 수 있지만 첫글자에는 들어갈 수 없다. ex) 2Car (X)
- $ _ 외의 특수문자는 사용할 수 없다.
- 자바에서 지정한 예약어라는게 있는데 그것들은 사용 불가 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라는 키워드를 작성한 뒤 클래스 이름을 붙이면 객체를 생성하고 사용할 준비를 한다.
'Java' 카테고리의 다른 글
Java - 제네릭스의 기본 개념( Generics ) (0) | 2022.03.11 |
---|---|
Java - java.lang 패키지 (0) | 2022.02.28 |
Java - 예외 및 예외 처리 ( Exception ) (0) | 2022.02.28 |
Java 제어문 - 반복문 ( for , while , do-while 문 ) (0) | 2022.02.12 |
Java 제어문 - 조건문 ( if / switch 문 ) (0) | 2022.02.11 |