하리Hari

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)

프로그램이 실행되는 중에 문자열이나 변수를 사용해서 동적으로 메서드를 부르고 싶다면 <'변수명'>() 문법을 사용해요.

[주문]을 설계하자:
    <취소하기>를 만들자 ():
        "주문이 취소되었습니다."를 출력하자

'주문서'를 [주문]인 새로운 [주문]()으로 정하자
'행동명'을 [문자열]인 "취소하기"로 정하자

(참고: 꺾쇠 안에 변수를 넣으면 런타임에 메서드를 찾아서 실행해요)
'주문서'의 <'행동명'>()을 실행하자
놀이터
결과
코드를 작성하고 '실행' 버튼을 눌러보세요.