이전에 공부했던 내용들을 복습 겸 정리해놓으려고 한다.
정의나 개념 등과 같은 것들은 인터넷에서 쉽게 찾을 수 있으니, 여기선 내가 공부한 내용을 적겠다.
객체지향 프로그래밍 VS 절차지향 프로그래밍
클래스에 대해서 알아보기 이전에, 객체지향과 절차지향에 대해서 먼저 알아보자.
- 절차지향 프로그래밍 : 쉽게 말하자면 첫번째 줄부터 끝까지 쭉 내려오면서 코드가 실행되는 것이다.
- 객체지향 프로그래밍 : 코드가 위에서부터 내려오면서 실행되는 절차는 동일하나, 객체가 많이 사용된다.
그렇다면 객체(Object)란 무엇인가?
철학적으로 객체란 "실존하는 모든 것" 또는 "인간이 인지하여 구별할 수 있는 것"이라고 한다.
그럼 여기서 잠깐 멈추고 클래스를 알아보자.
class라는 단어를 우리는 교실, 계급, 수준, 학급, 수업 등으로 사용한다.
사전을 찾아보면 동사로는 classify = 구분하다. 구별하다. 라는 뜻이 있다. 명사로는 구분, 구별 이다.
객체와 클래스에서 비슷한 부분이 있지 않은가?
바로 "구별!!"
그렇다. 객체와 클래스는 연관이 있다.
이제 클래스에 대해서 정의해보자.
"클래스란 어떠한 객체의 특성을 추상화한 것이다."
달리 말하면, "클래스는 객체를 만들 수 있는 설계도 또는 설명서이다." <- 다른 문서에서 흔히 볼 수 있는 설명
객체를 추상화하면 클래스가 되고
클래스를 구체화(인스턴스화)하면 객체가 된다.
잘 이해가 가지 않을 수 있다. 그럼 예를 들어보자.
스타크래프트에 "시즈탱크"라는 유닛이 있다.
이 시즈탱크는 실존하는 것이며, 내가 인지해 구별할 수 있으니 객체이다.
그런데 문제가 발생했다. 내가 이 시즈탱크를 하나 더 갖고 싶은 것이다.
그래서 '이걸 어떻게 만들 수 있지?' 하나하나 고민하면서 방법을 찾아냈고 하나 더 만들 수 있게 되었다.
그리고 나중에 또 만들 일이 있을 때 쉽고 빠르게 작업하기 위해 설명서와 설계도를 남겼다. 이를 클래스라고 한다.
이를 보고 다시 위의 설명을 보자.
시즈탱크(객체)를 만드는 방법을 찾아서(추상화) 설계도와 설명서(클래스)를 만들고
설계도와 설명서(클래스)로 부품을 조립하면(구체화/인스턴스화) 시즈탱크(객체)가 된다.
※ 객체지향 프로그래밍에서 개발자의 중요한 능력은 얼마나 classify를 잘 해내는가 인 것 같다. 예를 들어, 마린이라는 클래스가 있다. 그리고 파이어벳을 만드려는데 마린이랑 파이어벳은 비슷하니까 마린 클래스로 파이어벳을 만들 수도 있다.(좀 성가시겠지만.. 일단 설명을 위한 가정을 해보자.) 그런데 갑자기 마린 클래스로 시즈탱크가 나올 순 없는 것이다. 이는 마린과 시즈탱크의 특성이 많이 다르기 때문이다. 하고자 하는 말은, 클래스는 뚜렷한 특징을 가지고 나누어야겠다는 말인데 이해가 잘 됐으려나 모르겠다.
자 클래스의 개념을 알아봤으니 이제 클래스의 구성에 대해서 알아보자.
클래스는 크게 두 부분으로 구성되어 있다.
① "상태" 를 나타내는 부분. 정적이며, "멤버변수/전역변수/필드"라고 한다.
② "행위" 를 나타내는 부분. 동적이며, "메소드(method)/함수"라고 한다.
** 객체를 선언할 때 쓰이는 생성자도 있지만, 이는 다음에 알아보도록 하자. **
멤버변수
앞서 잠깐 얘기했듯, 객체의 상태를 나타내는 것이다. 가령 "사람"이란 클래스를 하나 만든다고 하면,
"이름", "성별", "나이" 등 사람의 상태를 나타낼 수 있는 것들을 멤버변수로 선언할 수 있겠다.
<참고> 여기서, 지역변수에 대해 알아보고 멤버변수와의 차이점이 무엇인지 공부하면 좋다.
간략한 특징으로 멤버변수는
ⓐ 프로그램이 실행될 때 메모리에 올려져, 프로그램이 종료될 때까지 유지된다. -> 초기화를 안해도 자동으로 초기화가 된다.
ⓑ 객체 안의 어느 부분에서든 사용이 가능하다. -> 프로그램 실행 중에 멤버변수가 어떤 값으로 바뀌어 가는지 잘 확인해야한다.
메소드
메소드는 객체의 행위를 나타내는 것이다. 앞의 "사람"이란 클래스에서 "인사하기", "걷기", "달리기" 등의 행동하는 것들을 메소드로 선언할 수 있겠다.
또 메소드는 함수라고 했다. 우리가 알고 있는 함수란 무엇인가?
어떤 값을 입력받고 계산식을 막 거친 다음 결과값을 알려주는 것이다. 메소드도 이와 같다.
다만, 메소드는 "외부의 영향을 받느냐, 안 받느냐"와 "외부에 영향을 주느냐, 안 주느냐"에 따라 4가지 방법으로 선언될 수 있다.
예를 들면 아래와 같다.
입력X, 출력X | 입력O, 출력X |
public void Greeting(){ ... } |
public void Greeting(String name){ ... } |
입력X, 출력O | 입력O, 출력O |
public String Greeting(){ return ... ; } |
public String Greeting(String name){ return ... ; } |
우리가 알고 있는 일반적인 함수와 연관해서 설명하려다보니 입력, 출력이라고 표현했는데
부연하자면, 어떤 값을 메소드에 넣거나 안 넣거나, 메소드에서 어떤 값이 나오거나 안 나오거나 이 뜻이다.
※ 어떤 메소드를 사용할 지는 상황에 맞춰서 잘 활용하면 된다.
'개발 > 자바' 카테고리의 다른 글
쓰레드 (Thread) (0) | 2020.05.22 |
---|---|
인터페이스와 추상클래스 - Interface and Abstract Class (0) | 2020.05.22 |
JavaFX (0) | 2020.05.17 |
자바 (람다식, Lambda Expression) (0) | 2020.05.08 |
자바 (제네릭, Generic) (0) | 2020.05.08 |
댓글