1. 클래스 (객체 설계도)
붕어빵 틀을 만들어서 똑같은 구조의 데이터를 슉슉 찍어볼까요?
규모가 큰 프로그램을 만들 때는 비슷한 데이터와 기능들을 하나로 묶어두면 아주 편리해요. 이것을 객체지향 프로그래밍이라고 부릅니다. 하리(Hari)에서는 이를 어떻게 구현하는지 하나씩 친절하게 알아볼까요?
클래스는 일종의 붕어빵 틀(설계도)이에요. 이 틀 하나만 잘 짜두면 수많은 붕어빵(객체)을 쉽게 찍어낼 수 있답니다!
[클래스]를 설계하자: 키워드로 설계도를 만들고, 처음 만들어질 때로 기본 세팅(생성자)을 정해줍니다.
[자동차]를 설계하자:
'색상'을 [문자열]인 "하양"으로 정하자
'속도'를 [숫자]인 0으로 정하자
처음 만들어질 때 ([문자열]인 '초기색상') 다음과 같이 하자:
'나'의 '색상'을 '초기색상'으로 정하자
<달리기>를 만들자 ([숫자]인 '증가량'):
'나'의 '속도'에 '증가량'을 더하자
틀"부릉부릉! 현재 속도는 {'나'의 '속도'}입니다."를 출력하자
'내차'를 [자동차]인 새로운 [자동차]("파랑")으로 정하자
틀"내 차 색상: {'내차'의 '색상'}"을 출력하자
'내차'의 <달리기>(50)을 실행하자
여기서 '나'(this)는 객체 스스로를 가리키는 특별한 단어예요. 내 안의 변수나 함수를 쓸 때는 꼭 '나'의를 붙여주세요! 객체를 새로 만들 때는 새로운 [클래스]() 키워드를 꼭 사용해요.
정적 멤버 (Static Members)
클래스 하나당 하나만 존재해서 모든 객체가 공유하는 정보나 기능이 필요할 때가 있죠?
그럴 때는 '나' 대신에 '우리'의 '속성' 또는 '우리'의 <메서드>를 사용해요!
[자동차]를 설계하자:
'우리'의 '총생산량'을 [숫자]인 0으로 정하자
처음 만들어질 때 () 다음과 같이 하자:
'우리'의 '총생산량'에 1을 더하자
[자동차]를 돌려주는 '우리'의 <공장>을 만들자 ():
새로운 [자동차]()를 돌려주자
'첫차'를 [자동차]인 새로운 [자동차]()로 정하자
'두번째차'를 [자동차]인 [자동차]의 <공장>()으로 정하자
틀"지금까지 만들어진 자동차 수: {'자동차'의 '총생산량'}"을 출력하자
연산자 덮어쓰기 (Operator Overloading)
객체들끼리 더하거나 비교하는 방법을 직접 정하고 싶을 때는 매직 메서드를 사용해요!
예를 들어 두 좌표의 위치가 같은지 확인하고 싶다면 <기호 같다> 메서드를 만들면 된답니다.
[좌표]를 설계하자:
'x'를 [숫자]인 0으로 정하자
'y'를 [숫자]인 0으로 정하자
처음 만들어질 때 ([숫자]인 '초기x', [숫자]인 '초기y') 다음과 같이 하자:
'나'의 'x'를 '초기x'로 정하자
'나'의 'y'를 '초기y'로 정하자
[논리]를 돌려주는 <기호 같다>를 만들자 ([좌표]인 '대상'):
만약 ('나'의 'x'와 '대상'의 'x'가 다르다) 라면:
거짓을 돌려주자
만약 ('나'의 'y'와 '대상'의 'y'가 다르다) 라면:
거짓을 돌려주자
참을 돌려주자
'점1'을 [좌표]인 새로운 [좌표](10, 20)으로 정하자
'점2'을 [좌표]인 새로운 [좌표](10, 20)으로 정하자
만약 ('점1'과 '점2'가 같다) 라면:
"두 좌표의 위치가 같습니다!"를 출력하자
덧셈이나 크기 비교도 같은 방법이에요. +는 <기호 더하기>, -는 <기호 빼기>, *는 <기호 곱하기>, /는 <기호 나누기>, %는 <기호 나머지>이고, 비교는 <기호 크다>, <기호 작다>, <기호 이상>, <기호 이하>예요. A + B는 A의 <기호 더하기>(B)를 부른 것과 같아서 왼쪽 객체의 메서드가 불리고, 'x'에 B를 더하자도 이 메서드를 써요.
[돈]을 설계하자:
'금액'을 [숫자]인 0으로 정하자
처음 만들어질 때 ([숫자]인 '금액') 다음과 같이 하자:
'나'의 '금액'을 '금액'으로 정하자
[돈]을 돌려주는 <기호 더하기>를 만들자 ([돈]인 '다른'):
새로운 [돈](('나'의 '금액' + '다른'의 '금액'))을 돌려주자
[논리]를 돌려주는 <기호 크다>를 만들자 ([돈]인 '다른'):
('나'의 '금액'이 '다른'의 '금액'보다 크다)를 돌려주자
'지갑'을 새로운 [돈](1000)으로 정하자
'지갑'에 새로운 [돈](500)을 더하자
('지갑'의 '금액')을 출력하자
만약 ('지갑'이 새로운 [돈](1200)보다 크다) 라면:
"1200원보다 많아요!"를 출력하자
3 * '가격'처럼 객체가 오른쪽에 있을 때는 왼쪽의 숫자가 메서드를 갖고 있지 않으니, 오른쪽 객체의 <기호 오른쪽 곱하기>가 왼쪽 값을 받아요. + - * / % 다섯 가지에 <기호 오른쪽 더하기>, <기호 오른쪽 빼기>, <기호 오른쪽 곱하기>, <기호 오른쪽 나누기>, <기호 오른쪽 나머지>가 있어요.
[돈]을 설계하자:
'금액'을 [숫자]인 0으로 정하자
처음 만들어질 때 ([숫자]인 '금액') 다음과 같이 하자:
'나'의 '금액'을 '금액'으로 정하자
[돈]을 돌려주는 <기호 곱하기>를 만들자 ([숫자]인 '배'):
새로운 [돈](('나'의 '금액' * '배'))을 돌려주자
[돈]을 돌려주는 <기호 오른쪽 곱하기>를 만들자 ([숫자]인 '배'):
새로운 [돈](('배' * '나'의 '금액'))을 돌려주자
'용돈'을 새로운 [돈](3000)으로 정하자
(('용돈' * 2)의 '금액')을 출력하자
((2 * '용돈')의 '금액')을 출력하자
동적 리플렉션 (Dynamic Reflection)
프로그램이 실행되는 중에 문자열이나 변수를 사용해서 동적으로 메서드를 부르고 싶다면 <'변수명'>() 문법을 사용해요.
[주문]을 설계하자:
<취소하기>를 만들자 ():
"주문이 취소되었습니다."를 출력하자
'주문서'를 [주문]인 새로운 [주문]()으로 정하자
'행동명'을 [문자열]인 "취소하기"로 정하자
(참고: 꺾쇠 안에 변수를 넣으면 런타임에 메서드를 찾아서 실행해요)
'주문서'의 <'행동명'>()을 실행하자