5주차 과제: 클래스


목표

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

학습할 것 (필수)

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

마감일시

2020년 12월 19일 토요일 오후 1시까지.

과제 (Optional)

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

클래스를 정의하는 방법


클래스의 선언과 구성

클래스는 클래스의 선언으로 시작 합니다. 


이런 클래스 선언은 최소한의 것으로 구성요소만 포함돼 있습니다. 

선언 시작시 수퍼 클래스의 이름, 인터페이스 구현 여부등은 아래처럼 나타낼 수 있습니다.


class 앞부분에 public 또는 private 과 같은 범위지정자를 추가할 수 있습니다. 
이를 정리하여 설명하면 다음과 같습니다. 

    1. public, private과 같은 범위지정자 설정이 가능합니다. 
    2. 규칙에 따라 첫 글자는 대문자로 설정하고 보통 낙타표기법을 사용합니다.
    3. 클래스의 부모가 있는 경우 extends 키워드를 통해 상속 받습니다.  클래스는 하나의 부모한 확장할 수 있습니다.
    4. 인터페이스는 쉼표로 구분하여 implements 키워드를 통해 구현합니다. 둘 이상의 인터페이스를 구현할 수 있습니다.
    5. 중괄호 {}로 둘러싸인 부분이 클래스의 본문이며 여기에는 필드, 생성자 그리고 메서드가 생성됩니다. 

클래스의 멤버 변수를 "필드"라고 하며 이는 세가지 구성 요소로 구성됩니다. 
    1. 0개이상의 범위지정자
    2. 필드의 유형
    3. 필드의 이름 

필드 또한 지역변수와 마찬가지로 초기화할 수 있지만 
초기화 하지 않는다면 기본값으로 설정됩니다. 



중첩클래스

자바에서는 다른 클래스 내에서 클래스를 정의할 수 있습니다. 이를 중첩 클래스 라고 하며 
이때 선언된 클래스는 static 과 non-static 으로 나뉩니다.
static class는 정적 중첩클래스 라고 하고 non-static 클래스는 내부클래스 라고 부릅니다.

중첩클래스는 다음과 같은 특징을 가집니다 .

    1. 한곳에서만 사용하는 클래스를 논리적으로 그룹화할 수 있습니다. 
- 한곳에서만 사용한다면 중첩시켜서 패키지를 간소화 시킬 수 있습니다.
    2. 캡슐화를 증가시킵니다.
- 각기 다른 두개의 클래스라면 클래스 접근을 위해 캡슐화를 포기해야 하지만 
중첩 클래스라면 private으로 지정하더라도 접근이 가능하고 내부클래스는 외부로 부터 차단이 가능합니다.
    3. 가독성을 증가시킵니다. 
- 사용처 내부에 클래스가 존재하기 때문에 사용되는 위치를 한번에 파악할 수 있습니다.

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



객체 생성의 명령문은 다음과 같은 모양을 합니다. 

Group memberGroup = new Group("mem1", "mem2");

이는 세부분으로 구성됩니다. 

1. 선언: 굵게 표시된 코드 세트는 변수 이름과 객체 유형을 연결하는 모든 변수 선언입니다.
2. 인스턴스화: new 키워드는 객체를 생성하는 java 연산자 입니다.
3. 초기화: new 연산자 다음에 생성자 호출이 이어지며, 이는 새 객체를 초기화 합니다.

선언 - 객체를 참조하는 변수 선언으로 Group memberGroup 부분에 해당합니다. 이때는 객체가 실제로 생성하는 부분이 아니며 
생성을 위해서는 new 연산자를 사용해야 합니다. 코드에서 사용하기 전에 객체를 할당해야 하며 그렇지 않으면 컴파일러 오류가 발생합니다.

인스턴스화 - 객체를 생성하는 부분입니다. 메모리를 할당 하고 메모리에 대한 참조를 반환하여 클래스를 인스턴스화 합니다. 

초기화 - 객체를 생성할 때 인자를 넣어주어 값을 넣어줍니다. 아래에 생성자 정의하는법에서 방법에 대해 자세히 서술하겠습니다.

메소드 정의하는 방법

일반적인 메소드 선언의 예는 아래와 같습니다. 


메소드 선언의 필수요소는 반환유형, 이름, 괄호쌍 및, 중괄호와 본문입니다.
일반적으로는 아래의 구성요소로 구성됩니다. 

1. 범위지정자
2. 반환 유형 - 반환값이 존재하지 않는경우 void 를 사용합니다.
3. 메소드 이름 - 보통 소문자로 시작하여 낙타표기법을 사용합니다.
4. 괄호 안의 매개변수 - 데이터유형과 이름으로 나뉘어서 적습니다. 매개변수를 사용하지 않는다면 빈 괄호를 사용합니다.
5. 중괄호로 묶인 메소드 본문 - 지역 변수 선언을 포함하여 메소드의 코드 부분입니다.

반환값이 void가 아닌 모든 메소드는 해당 반환유형에 맞는 반환값을 포함해야 하며 
이는 메소드 본문에서 return 이라는 명령어를 통해 이루어 집니다. 


오버로딩
java는 오버로딩 메소드를 지원 하묘 이는 메소드 서명이 다른 메소드를 구별할 수 있습니다.
즉 클래스 내의 메소드가 다른 매개 변수 목록을 가진 경우 동일한 이름을 가질 수 있습니다.
- 메소드 서명: 메소드의 이름 + 매개변수의 자료형 

예를 들어 아래와 같은 모양의 메소드들은 같은 클래스 내에 존재할 수 있습니다. 


오버로드 된 메소드는 메소드에 전달되는 인수의 수와 유형으로 구분합니다. 
이 때 컴파일러는 반환형식을 구분하지 않으므로 반환형식을 달리 해서는 오버로딩할 수 없습니다. 
(잦은 오버로딩 사용은 가독성을 줄릴 수 있습니다.)

생성자 정의하는 방법

java의 생성자는 객체를 초기화 하는 데 사용되는 특수 메소드 입니다. 
클래스의 객체가 생성 될 때 호출되며, 색체 속성에 대한 초기 값을 설정하는 데 사용합니다.



생성자 이름은 클래스 이름과 일치해야하며 반환 유형을 가질 수 없습니다. (항상 void)
클래스 생성자를 생성하지 않는다면 java가 생성자를 생성합니다. 그러나 개체속성에 대한 
초기값을 설정할 수 없습니다.

생성자 또한 메소드이기 때문에 매개변수를 가질 수 있고, 오버로딩 또한 가능합니다. 


this 키워드 이해하기


인스턴스 메서드 또는 생성자에서 이것은 현재 개체, 즉 메서드 또는 생성자를 호출하는 개체에 대한 참조입니다.
이를 사용하여 인스턴스 메서드 또는 생성자에서 현재 개체의 멤버를 참조할 수 있습니다.

this 키워드를 사용하는 가장 일반 적인 이유는 필드가 메서드/생성자 매개 변수에 의해 구분되지 않기 때문입니다.

간혹 바로 위와 같은 메소드의 경우 a와 b를 필드와 같은 이름의 x, y의 이름을 주어 이렇게 작성할 수 있습니다. 


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


x를 중심 좌표로 length만큼의 길이의 직선을 생성하는 클래스가 있다면 
첫번째 인수가 없는 생성자는 항상 0에서 10길이의 직선을 생성하고
두번째 인수가 한개인 생성자는 0에서 부터 입력받은 길이만큼의 직선을 생성 
세번째 인수가 두개인 생성자는 x 좌표부터 length길이 만큼의 직선을 생성합니다. 





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

댓글

이 블로그의 인기 게시물

git-receive-pack not permitted on 깃 허브 로그인 관련 문제