2020. 12. 18.

5주차 과제: 클래스

https://github.com/whiteship/live-study/issues/5

목표

자바의 Class에 대해 학습하세요.

학습할 것 (필수)

  • 클래스 정의하는 방법
  • 객체 만드는 방법 (new 키워드 이해하기)
  • 메소드 정의하는 방법
  • 생성자 정의하는 방법
  • this 키워드 이해하기

과제 (Optional)

  • int 값을 가지고 있는 이진 트리를 나타내는 Node 라는 클래스를 정의하세요.
  • int value, Node left, right를 가지고 있어야 합니다.
  • BinrayTree라는 클래스를 정의하고 주어진 노드를 기준으로 출력하는 bfs(Node node)와 dfs(Node node) 메소드를 구현하세요.
  • DFS는 왼쪽, 루트, 오른쪽 순으로 순회하세요.


클래스 정의하는 방법

class MyClass {
    // UpperCarmelCase를 사용
    // 클래스 이름은 일반적으로 명사 또는 명사구
    // 때로는 형용사 형용사구 예) Readable
    // 테스트 클래스의 경우 마지막에 Test로 끝나도록
    // 예) HashTest
}
class MyClass extends MySuperClass implements YourInterface {
    // MySuperclass의 하위 클래스이고 
    // YourInterface 인터페이스의 구현을 표시
}
private class MyClass {
    // 접근 제어자
    // private -> default -> protected -> public
    // 순으로 보다 많은 접근을 허용
}

참고: https://google.github.io/styleguide/javaguide.html#s5.2.2-class-names


객체 만드는 방법 (new 키워드 이해하기)

// MyClass.java file
public class MyClass {
}
// Main.java file
public class Main {
    public static void main(String[] args) {
        MyClass mc = new MyClass();
    }
}
javap -c Main.class

public static void main(java.lang.String[]);
Code:
 0: new           #7  // class com/company/MyClass
 3: dup
 4: invokespecial #9  // Method com/company/MyClass.<init>:()V
 7: astore_1
 8: return

#0 new - 상수 풀(constant pool) 인덱스에서 클래스 참조(reference)로 식별되는 새로운 객체를 생성

#3 dup - 스택의 가장 위의 값을 복제

인스턴스화

new 키워드는 객체를 생성하는 Java 연산자입니다.

초기화

new 연산자 다음에 생성자 호출이 이어지며 이는 새 객체를 초기화합니다.

출처: https://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html


메소드 정의하는 방법

public double calculateAnswer (double wingSpan,
    int numberOfEngines, double length, double grossTons) {
    // 여기서 계산
}

메서드 선언에는 순서대로 6개의 구성 요소가 있습니다.

1. 수정자
예) public, private

2. 반환 유형
메소드에서 반환한 값의 데이터 유형 또는 void(메소드가 값을 반환하지 않는 경우).

3. 메소드 이름
lowerCamelCase로 작성
일반적으로 동사, 동사구 예) sendMessage, stop
JUnit 테스트 메소드 이름에 밑줄이 표시되어 논리적 구성 요소를 구분할 수 있으며 각 구성 요소는 lowerCamelCase로 작성
전형적인 패턴 예시 <methodUnderTest>_<state>, pop_emptyStack
테스트 이름을 정하는 올바른 방법은 없습니다.
출처: https://google.github.io/styleguide/javaguide.html#s5.2.3-method-names

4. 괄호 안의 매개 변수 목록
쉼표로 구분된 입력 매개 변수 목록으로 데이터 유형이 앞에 있고 괄호()로 묶여 있습니다.
매개 변수가 없으면 빈 괄호를 사용.

5. 예외 리스트

6. 중괄호로 묶인 메서드 본문
지역 변수 선언을 포함하여 메소드의 코드가 여기에 표시됩니다.

출처: https://docs.oracle.com/javase/tutorial/java/javaOO/methods.html


생성자 정의하는 방법

public class Main {
    int x;

    // 클래스 생성자 생성
    public Main() {
        x = 5;
    }

    public static void main(String[] args) {
        Main myObj = new Main();
        // 메인 클래스 객체를 선언하면서 생성자를 호출
    }
}

생성자 생성 규칙

1. 클래스명과 메소드명이 동일하다.

2. 리턴타입을 정의하지 않는다.


this 키워드 이해하기

public class Point {
    public int x = 0;
    public int y = 0;
        
    // 생성자
    public Point(int a, int b) {
        x = a;
        y = b;
    }
}
public class Point {
    public int x = 0;
    public int y = 0;

    // 생성자
    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

인스턴스 메소드 or 생성자 내에서 현재 사용하고 있는 객체에 대한 참조

this 키워드를 사용하는 가장 일반적인 이유는 필드(Field: 클래스 영역 안의 변수)가 메소드 or 생성자 매개 변수로 음영 처리되기 때문

this 키워드를 사용하여 동일한 클래스의 다른 생성자를 호출할 수 있습니다. 이를 명시적 생성자 호출(explicit constructor invocation)이라고 합니다.

public class Rectangle {
    private int x, y;
    private int width, height;

    public Rectangle() {
        this(0, 0, 1, 1);
    }
    public Rectangle(int width, int height) {
        this(0, 0, width, height);
    }
    public Rectangle(int x, int y, int width, int height) {
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
    }
    ...
}

출처: https://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html


과제

아직 작성 중입니다.

public class Node {

    // int 값을 가지고 있는 이진 트리를 나타내는
    // Node 라는 클래스를 정의하세요.

    // int value, Node left, right 를 가지고 있어야 합니다.
    private int value;
    private Node left;
    private Node right;

    public Node(int value) {
        this.value = value;
        this.left = null;
        this.right = null;
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }

    public Node getRight() {
        return right;
    }

    public void setRight(Node right) {
        this.right = right;
    }

    public Node getLeft() {
        return left;
    }

    public void setLeft(Node left) {
        this.left = left;
    }
}
public class BinaryTree {
    // BinrayTree라는 클래스를 정의하고 주어진 노드를
    // 기준으로 출력하는 bfs(Node node)와 dfs(Node node)
    // 메소드를 구현하세요.
    // DFS는 왼쪽, 루트, 오른쪽 순으로 순회하세요.

    // Breadth First Search (또는 Level Order Traversal)
    // : 너비우선탐색
    // Depth First Search : 깊이우선탐색

    // 트리의 루트
    Node root;

    // 기본 생성자에서 루트 값 초기화
    BinaryTree() {
        root = null;
    }

    void insertNode(int value) {
        root = insertRec(root, value);
    }

    Node insertRec(Node root, int value) {

        if (root == null) {
            root = new Node(value);
            return root;
        }

        if (value < root.getValue()) {
            root.setLeft(insertRec(root.getLeft(), value));
        } else if (value > root.getValue()) {
            root.setRight(insertRec(root.getRight(), value));
        }

        return root;
    }

}




댓글 없음:

댓글 쓰기