백기선 자바 라이브 스터디 5: 클래스

Hoyoung Jung·2020년 12월 19일
1

참고자료

  • Oracle Java SE 8 Fundamentlas (Oracle University 교재)
  • 객체지향의 사실과 오해, 조영호

클래스 정의

public class Hello {
	//fields of the class here
    //methods here
}
  • class 키워드를 이용해서 정의한다.
  • 관습적으로 대문자로 시작한다. 카멜케이스를 주로 사용
  • public: modifier
  • 멤버 변수 혹은 필드로 불리는 상태 또는를 갖을 수 있다.
  • 메소드라 불리는 행동(behaviors) 또는 오퍼레이션(Operation)을 갖을 수 있다.
  • 자바는 한 파일에 하나의 public 클래스만 허용한다.
  • 클래스는 객체를 생성해 주는 도구, 레시피, 혹은 청사진(blueprint)이라고 할 수 있다.
    -오브젝트의 속성(properties)과 행동(behaviors)을 정의한다.
  • 클래스를 정의하고 이를 이용해 객체(instance)를 생성할 수 있다.

패키지

  • 클래스를 위한 네임스페이스
  • 클래스가 저장될 폴더
  • 소문자로 시작
package net.honux;

public class Hello { 

객체 생성

  • new 키워드로 객체를 생성할 수 있으며 객체는 힙에 저장된다.
  • 저장된 객체는 참조변수를 통해 접근할 수 있다.
  • 참조변수를 통해 접근할 수 없는 객체는 gc에 의해 정리된다.
  • 자바의 대표적인 객체는 배열과, 클래스의 인스턴스이다.
  • (생각) 람다도 객체인 것 같은데, 구글링 좀 해 보자.
  • (생각) call by reference로 동작하고 매개변수로 넣을 수 있는 건 다 객체가 아닐까 싶다.
  • java10부터 var 키워드를 이용하면 타입추론이 가능하다.
Hello h = new Hello();
var h2 = new Hello();

메소드

public static int display(int value) {}
  • public: 접근 한정자, public, protected, default, private의 범위를 가짐

  • static: static으로 선언하면 인스턴스 없이 호출 가능하지만 메소드 내에서 static이 아닌 멤버 변수를 사용할 수 없다. 왜인지는 라이프사이클을 조금 생각해 보면 알 수 있다.

  • int: 리턴타입, 한 번에 하나의 값 혹은 객체만 리턴 가능

  • (int value): 매개변수, 원시 타입은 call by vlaue, 객체는 call by reference

접근 한정자

Access ModifierWithin ClassWithin PackageOutside Package by Subclass OnlyOutside Package
publicOOOO
protectedOOXX
default (package private)OOXX
privateOXXX

. 연산자

Hello h = new Hello();
h.sayHi();
Hello.hello();
  • 메소드를 호출하기 위해서는 . 연산자를 사용한다.
  • static 메소드는 클래스이름.메소드이름()으로 호출
  • non-static 메소드는 참조변수이름.메소드이름()으로 호출

main 메소드

public static void main(String[] args) { }
  • 프로그램을 시작하는 엔트리 포인트

System.out.println

  • 표준출력을 위해 사용함

  • System: 유용한 필드와 메소드를 가지고 있다. new로 객체를 생성할 수 없으므로, public 생성자가 없다고 추정할 수 있다.

  • System.out : 스태틱 필드, PrintStream 객체이다.

  • System.out.println: out 객체의 public 메소드이다.

생성자

public class Hello {
  • 생성자는 특별한 형태의 메소드로 객체를 생성할 때 사용
  • 생성자는 리턴 타입이 없다.
  • 생성자가 없을 경우 매개변수 없는 public 생성자가 하나 자동으로 생긴다.
  • 생성자는 private으로 선언 가능하고 이 경우 생성자 호출로 객체를 만들 수 없다.
  • 생성자는 메소드와 달리 직접 호출이 불가능하다.

this

public class Main {
  int x;

  // Constructor with a parameter
  public Main(int x) {
    this.x = x;
  }

  // Call the constructor
  public static void main(String[] args) {
    Main myObj = new Main(5);
    System.out.println("Value of x = " + myObj.x);
  }
}
  • this 키워드는 생성자나 메소드안에서 현재 객체의 참조로 사용할 수 있다.
  • static method 안에서는 this를 사용할 수 없다. 역시 생각해 보면 유추 가능하다.

this의 여러가지 사용법

  • 생성자 호출 this()
  • 현재 메소드 호출 this.hi()
  • 현재 객체 리턴 return this;
  • 메소드나 생성자 안에서 매개변수로 사용 가능

[기타] 객체지향의 사실과 오해 1장 요약

서론

  • 객체지향의 목표는 실세계를 모방하는 것이 아니다. 오히려 새로운 세계를 창조하는 것이다.
  • 소프트웨어 객체가 실세계 사물의 모방이라는 전통적 개념은 실용적이지는 않지만, 객체지향이라는 개념을 이해하는데는 큰 도움이 될 수 있다.

커피 주문하기

  • 커피 주문은 손님, 캐시어, 바리스타의 역할, 책임, 협력이라는 개념이 조화를 이루며 만들어낸다.
  • A는 손님 역할의 객체이고 커피를 주문할 책임을 진다.
  • B는 캐시어 역할의 객체이고 주문한 커피를 바리스타에게 알려준다.
  • C는 바리스타 역할의 객체이고 커피를 완성해서 A에게 진동벨로 알린다.
  • (생각) 책에는 없지만 진동벨도 객체가 아닐까?

요청과 응답으로 구성된 협력

  • 요청은 연쇄적으로 발생
  • 손님 → 주문 → 캐시어 →(손님: 진동벨, 바리스타: 주문메뉴) → 바리스타 → 제조 → (진동벨) → 손님
  • (생각)진동벨은 객체이면서 비동기 이벤트 처리 방식이구나.
  • (생각) 바리스타도 곰곰히 생각해 보면 메시지 큐를 이용해서 처리하는 듯한 느낌이 든다.
  • (생각) 손님은 콜백함수로 등록된 진동벨 이벤트 핸들러를 이용...

역할과 책임

  • 세상에 존재하는 많은 일들은 혼자서 하기에는 너무 복잡하기 때문에 책임을 가진 객체의 협력으로 일이 진행된다.
  • 역할은 의미적으로 책임을 내포한다.
  • 선생은 암묵적으로 학생을 가르칠 책임을 가진다.
  • 여러 사람이 동일한 역할을 수행할 수 있다.
  • 역할은 대체 가능성을 의미한다.
  • 책임을 수행하는 방법은 자율적으로 선택할 수 있다.
  • 한 사람이 동시에 여러 역할을 수행 가능하다.

협력 속 객체

  • 객체는 애플리케이션의 기능 구현을 위해 존재한다.
  • 작은 기능도 객체 혼자서는 감당할 수 없기 때문에 다른 객체와의 협력을 통해 기능을 구현한다.
  • 객체는"협력적"이어야 한다.
  • 객체는 "자율적"이어야 한다.
  • 객체는 상태와 행동을 가진 자율적인 실체이다.
  • 객체는 자율적이기 때문에 다른 객체가 무엇(what)을 하는지는 알 수 있지만 어떻게(how) 하는지는 알 수 없다.

메시지

  • 객체는 메시지를 통해 다른 객체와 협력함

메소드

  • 객체가 메시지를 처리하는 방법
  • 메시지를 수신한 객체가 어떤 메소드를 선택할지는 런타임에 결정됨

상태와 행동

  • 객체는 상태를 가지며 상태는 변경 가능
  • 상태를 변경하는 것은 객체의 행동
  • 행동의 결과는 상태에 의존적
  • 행동의 순서가 결과에 영향을 미침

객체지향

  • 시스템을 상호작용하는 자율적인 객체들의 공동체로 바라보고 이를 이용해 시스템을 분할하는 방법
  • (생각) 나는 데이터를 유관한 필드의 집합이라고 생각하는데 여기서는 객체를 관련된 책임의 집합이라고 정의하는 점이 재미있다.

객체지향은 클래스 중심이 아니다!

  • (생각) 대다수가 클래스 다이어그램을 가장 중요하다고 생각한다고 한다. 나는 구현할 때 여러 장의 시퀀스 다이어그램을 그려 보는 것이 가장 좋았다.
  • 객체의 공동체가 아닌 클래스가 강하게 결합된 설계도는 유연한고 확장 가능한 애플리케이션의 구축을 방해한다.
  • 클래스의 관점에서 메시지를 주고받는 객체의 관점으로 사고의 중심을 전환하자!
  • 클래스 메소드가 아니라 객체의 역할, 책임, 협력에 집중하라!

코딩 과제

  • 노드 만들기
  • 트리 초기화
  • DFS, BFS 구현
  • postorder, preorder 추가 구현
  • 업무로 인해 TS를 학습하고 있는데, TS generic 학습 기념으로 generic으로 구현해 봄.

과제링크

 public String bfs() {
        traveller = new StringBuffer();
        Queue<Node> queue = new LinkedList();
        queue.add(this.head);
        while (!queue.isEmpty()) {
            Node node = queue.remove();
            if (node == null) continue;
            traveller.append(node.getValue());
            queue.add(node.left());
            queue.add(node.right());
        }
        return traveller.toString();
    }

    private void inorder(Node<T> node) {
        if (node == null) return;
        inorder(node.left());
        traveller.append(node.getValue());
        inorder(node.right());
    }
profile
주짓수를 좋아하는 개발자

1개의 댓글

comment-user-thumbnail
2020년 12월 19일

라이브 방송 후기

답글 달기