이번 포스팅은 프로 개발자를 꿈꾸지만 객체 지향을 잘 모르는 사람을 대상으로 자바 다형성과 상속의 개념을 전달하고자 한다. 요즘 세계적으로 화제를 불러 모으고 있는 '오징어 게임'을 소재로 사용했다.
'오징어 게임으로 자바 다형성과 상속 이해하기'의 주요 내용은 다음과 같다.
- 자바 다형성, 상속이란 무엇인가?
- 오징어 게임을 자바 클래스로 구현하고, 자바의 객체 지향 개념을 이해한다.
지난번에도 강조했지만 당신이 혹시 자바와 같은 객체 지향 프로그램으로 취직이나 프리랜서를 꿈꾸고 있다면 자바의 다형성은 숨쉬는 것처럼 아무 생각없이 이용할 수 있는 연습을 해야 한다. 상속, 추상화, 인터페이스와 같은 자바의 다형성을 이해하고 나서야 객체 지향의 핵심인 디자인 패턴을 시작해 볼 수 있기 때문이다.
자바 다형성이란 무엇인가?
자바 다형성이란 무엇인가? 먼저, 재미없는 이야기부터 빨리 끝내자.
Java의 다형성은 단일 작업을 다른 방식으로 수행할 수 있는 작업으로 정의할 수 있다. 또는 하나의 객체가 여러 가지 타입을 가질 수 있다고 표현하기도 한다.
다형성은 상속, 추상화 등을 통하여 객체 지향 프로그래밍을 구성하는 중요한 특징 중 하나라고 할 수 있다. 다형성을 지원하지 않는 언어는 객체 지향 언어라고 부르지 않는다.
내가 쓰고도 무슨 말인지 잘 모르겠다. 약간 억지스럽지만 쉽게 해석해 보겠다. 홍길동이 볏단에 요술을 부려서 사또도 만들고 이방도 만들고 춘향이도 만드는 것을 연상해 보자.
홍길동은 개발자(프로그래머)가 되고, 볏단이 사또가 되거나 이방이 되거나 춘향이가 되는 것은 다형성(상속)이다. 잘 몰라도 일단 넘어가자. 오징어 게임을 예로 들어 최대한 쉽게 설명해 볼 테니 다 끝나고 나서 이 부분을 다시 읽어 보는 것도 좋겠다.
오징어 게임을 이용하여 자바의 상속을 구현해 보자.
오징어 게임을 자바 상속으로 구현하기 #1. 부모 클래스를 만든다.
오늘 배울 내용을 그림으로 그려보면 다음과 같다.
전문 용어로 클래스 다이어그램이라고 한다. 여러분도 개발하기 전에 손으로 그려보는 연습을 하기 바란다. 실세계의 문제를 클래스로 추상화하는 연습도 객체 지향 프로그래밍을 익히는데 아주 중요한 과정이다.
혹시 자바 클래스의 개념을 모른다면 전 편을 참고하자.
홍길동도 홍상직이라는 아버지가 없었다면 존재할 수도 없었을 것이다. 우리도 부모 클래스를 먼저 만들어야 한다. 그리고, 클래스는 속성(멤버 변수)과 메쏘드(함수)를 갖는다. 부모 클래스의 명세서를 아래와 같이 간단하게 작성해 보자.
- 클래스 이름: Game
- 속성(멤버 변수): name, gameRule
- 메쏘드(함수): sayName, describeGameRule
위의 내용을 자바로 구현하면 다음과 같다.
/*
* 오징어 게임으로 자바 다형성 구현하기
*
* Copyright: 쌀사비파 걍교쥬
* https://shawsk.tistory.com
*/
package shawsk.tistory.com;
public class Game {
String name; // 멤버 변수
String gameRule; // 멤버 변수
Game() { // 생성자
name = "게임";
gameRule = "지면 뒤진다!";
}
void sayName() { // 메쏘드
System.out.println("이름 : " + name);
}
void describeGameRule() { // 메쏘드
System.out.println("게임 규칙 : " + gameRule);
}
}
실제로 동작하는지 각자 테스트 해 보기 바란다. 나는 아래처럼 테스트를 진행했다.
/*
* 오징어 게임으로 자바 다형성 구현하기
*
* Copyright: 쌀사비파 걍교쥬
* https://shawsk.tistory.com
*/
package shawsk.tistory.com;
public class Main {
public static void main(String[] args) {
Game game = new Game();
game.sayName();
game.describeGameRule();
}
}
오징어 게임을 자바의 상속으로 구현하기 #2. 자식 클래스를 만든다.
오징어 게임에는 대략 6가지 게임이 등장한다. 시간을 줄이기 위해서 달고나(Dalgona), 오징어(Ozinger)의 두 가지를 자식 클래스로 만들어 보겠다.
- 부모 클래스(Parent Class): Game
- 자식 클래스(Child Class): Dalgona, Ozinger
자식 클래스의 이름은 한글 발음을 영문으로 옮겼다. 객체 지향 프로그램에서는 작명하는 것도 쉬운 일이 아니다. 변수, 함수, 클래스 등 모든 이름에 가능하면 의미 있는 이름을 붙이는 습관을 기르자.
이제 본격적으로 상속을 시작한다.
Game 클래스를 상속하여 달고나 게임을 만들자.
"public class Dalgona extends Game"
-> Dalgona는 Game을 상속한다는 뜻이다.
-> 그리고, Game의 함수를 가져와서 Overriding 한다.
자바로 위의 내용을 코딩하면 아래와 같이 된다.
/*
* 오징어 게임으로 자바 다형성 구현하기
*
* Copyright: 쌀사비파 걍교쥬
* https://shawsk.tistory.com
*/
package shawsk.tistory.com;
public class Dalgona extends Game{
String name; // 멤버 변수
String gameRule; // 멤버 변수
Dalgona() { // 생성자
name = "달고나";
gameRule = "달고나의 모양을 10분 안에 만들어라, 안 그럼 뒤진다!";
}
@Override
void sayName() { // 메쏘드
System.out.println("이름 : " + name);
}
@Override
void describeGameRule() { // 메쏘드
System.out.println("게임 규칙 : " + gameRule);
}
}
이번에는 똑같은 방식은 Game 클래스를 상속하여 오징어 게임을 만들어 보겠다.
/*
* 오징어 게임으로 자바 다형성 구현하기
*
* Copyright: 쌀사비파 걍교쥬
* https://shawsk.tistory.com
*/
package shawsk.tistory.com;
public class Ozinger extends Game{
String name; // 멤버 변수
String gameRule; // 멤버 변수
Ozinger() { // 생성자
name = "오징어";
gameRule = "맘대로 해서 상대를 이겨라, 안 그럼 뒤진다!";
}
@Override
void sayName() { // 메쏘드
System.out.println("이름 : " + name);
}
@Override
void describeGameRule() { // 메쏘드
System.out.println("게임 규칙 : " + gameRule);
}
}
부모 클래스인 게임을 상속해서 달고나 게임, 오징어 게임의 두 가지 자식 클래스를 만들었다. 벌써 끝이다. (난 3시간째 이러고 있다.)
마지막으로 최종 완성된 오징어 게임을 테스트 해 보자. 나는 이렇게 해 보겠다.
/*
* 오징어 게임으로 자바 다형성 구현하기
*
* Copyright: 쌀사비파 걍교쥬
* https://shawsk.tistory.com
*/
package shawsk.tistory.com;
public class Main {
public static void main(String[] args) {
Game game;
game = new Game();
game.sayName();
game.describeGameRule();
game = new Dalgona();
game.sayName();
game.describeGameRule();
game = new Ozinger();
game.sayName();
game.describeGameRule();
}
}
이제 자바 다형성의 한 종류인 상속이 이해가 되는가? Dalgona와 Ozinger는 부모 클래스인 Game의 메쏘드(함수)를 물려받아서 자기 마음대로 사용할 수 있게 된 것이다.
드디어 여러분도 홍길동처럼 볏단으로 사또, 이방, 춘향을 만드는 요술을 부릴 수 있게 되었다. 객체 지향 프로그래밍에 대한 감이 잡혔길 바란다. 혹시 잘 모르겠다면 처음부터 다시 반복하길 바란다.
오징어 게임을 이용한 자바 상속 레슨을 마치며
이번 포스팅은 요즘 전 세계적으로 큰 화제를 불러 모으고 있는 '오징어 게임'을 예제로 사용하여 자바 객체지향의 가장 기본이자 핵심인 다형성과 상속의 기본에 대하여 설명해 보았다.
해 보고 싶은 내용은 많지만 허리도 아프고 손가락도 힘들어서 이만 마친다. 다음에는 오징어 게임 자바 상속 편에 이어 오징어 게임 자바 인터페이스 편을 해 볼 예정이다. (이 글이 어느 정도 조회수가 나온다면 말이다.)
홍길동은 아비를 아비라 부르고 싶은 마음이 간절했다.
나는 주변의 개발자 동료들이 자바를 자바처럼 쓰기를 간절하게 바란다. 하지만, 현실은 열에 아홉은 관심 없다.
대부분 자바를 C처럼 짜고 예외 처리도 안 한 상태에서 릴리즈한다. 그리고, 버그가 발생하면 그걸 이슈로 삼아서 향후 개발 일정을 추가한다. 어차피 시간만 때우면 월급이 나온다는 심산일 것이다. 그러나, 그런 친구는 10년이 지나도 초보 개발자 수준이고 주변에서 다들 무시하고 있다는 것을 알고 있으면서 무시하는 것인지, 아예 모르고 있는 것인지 나도 모르겠다.
저런 친구도 호봉이 차면 프로젝트 개발을 책임지는 자리에 오른다. 저 친구가 담당한 프로젝트는 시간이 지날수록 실무 개발자들의 저항에 부딪히게 되고, 결국 호봉으로 불만을 찍어 누르게 된다. 그리고, 관리자도 그 사실을 인지하게 되는 운명의 순간이 오게 된다.
저런 개발자는 보통 5단계를 거치게 된다.
- 프로젝트가 곯아 터질 때까지 버틴다.
- 문제가 폭발할 즈음에 새로운 조직으로 탈출해서 정체가 탄로나기 전까지 버틴다.
- 모든 조직에 소문이 자자해지고, 더 이상 받아줄 조직이 없다면 책임 자리를 박탈당한다.
- 개발은 못 하니 본인의 일을 대신할 호구를 구하는 동시에 이직을 시도한다.
- 어느 순간 사내 전산 시스템에서 이름이 삭제된다.
웬지 오징어 게임에도 이런 캐릭터가 있었던 듯하다. 어쨌든 쓸데없는 이야기가 본문보다 길게 이어진 것 같아 송구하다. 혹시 본문의 내용 중 틀린 내용이 있다면 적극적인 지적질을 부탁드린다.
직장인을 위한 돈나무 키우기 게임도 있습니다.
제가 키우는 돈나무인데 구경 한 번 해 보시렵니까?
'나는 개발자다 > 실전 자바' 카테고리의 다른 글
실전 코딩 #02. 상생소비지원금 계산기, 자바(JAVA)로 코딩해 보자. (6) | 2021.10.10 |
---|