티스토리 뷰

반응형

목표

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

학습할 것 (필수)

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

과제 (Optional)

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

클래스 정의

클래스를 흔히 붕어빵 틀에 비유하곤한다.

클래스는 객체 지향 프로그래밍에서 특정 객체를 생성하기 위해 변수와 메소드를 정의하는 일종의 이다. 객체를 정의 하기 위한 상태메서드로 구성된다. 템플릿을 사용하면 객체를 클래스로 정의할 때 멤버의 자료형을 미리 정하지 않고 객체를 사용할 때 결정할 수 있다. 클래스는 전부 또는 일부를 그 클래스의 특성으로부터 상속받는 서브클래스를 가질 수 있으면, 클래스는 각 서브 클래스에 대해 수퍼 클래스가 된다. 서브클래스는 자신만의 메소드와 변수를 정의할 수도 있다.

이러한 클래스와 그 서브클래스 간의 구조를 "클래스 계층(hierarchy)"이라 한다.

객체

클래스에 규정된 인스턴스로서, 변수 대신 실제 값을 가진다.

객체 지향 프로그래밍

객체 지향 프로그래밍(영어: Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임 중 하나이다. 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.

클래스 정의하는 방법

강제된 규칙은 아니지만 관례적으로 클래스 이름은 영어로 첫 자를 대문자로 작성하고

혼합된 이름일 경우 각 단어의 첫 머리 글자는 대문자로 작성한다. (Camel 표기법)

ex) User, UserDetail

"클래스이름.java"로 소스 파일을 생성한다. 소스 파일 이름은 대소문자를 구분하기 때문에 클래스 이름과 대소문자가 같도록 해야한다. 소스 파일 하나에 두 개 이상의 클래스 선언이 가능하지만,

파일이름과 동일한 이름의 클래스 선언에만 public 접근 제한자를 붙일 수 있다. 가급적 소스 파일 하나 당 하나를 선언하는 것이 좋다.

클래스 구성멤버

  • 필드(Field) : 객체의 데이터( 상태 ) 가 저장되는 곳

  • 생성자(Constructor) : 객체 생성 시 초기화

  • 메소드(Method) : 객체의 동작에 해당하는 실행 블록

public class Car{
  // 필드
  int battery;
    String engine;

  // 생성자
  Car() {...} 

  // 메소드
  void run() {...}
  void stop() {...}
}
  • 필드

    • 객체의 고유 데이터, 객체의 현재 상태 데이터를 저장하는 곳이다.
    • 생성자와 메소드 전체에서 사용되며 객체가 소멸되기 전까지 객체와 함께 존재한다.
  • 생성자

    • 생성자는 메소드와 비슷하게 생겼지만 클래스 이름으로 되어있고 .

      리턴 타입이 없다.

    • 생성자를 실행시키지 않고 클래스로부터 객체를 만들 수 없다.

    • 생성자가 생성되면 Heap Area에 객체가 생성되고 객체의 주소가 리턴된다.

    • 리턴된 객체의주소는 클래스타입 변수에 저장되어 객체에 접근 할 때 이용된다.'

    • 아무것도 안해도 디폴트 생성자가 만들어진다.

  • 메소드

    • 객체의 동작에 해당한다.

    • 메소드를 호출하게 되면 중괄호 블록에 있는 코드들이 일괄적으로 실행되고

      필드 읽기, 수정, 객체간 협력 수단 등 다양한 기능을 수행하기 위해 사용되며

      외부로부터 매개값을 받을 수 있고 실행 후 어떠한 값을 리턴 할 수도 있다.

    • 메소드 이름은 자바 식별자 규칙에 맞게 작성한다.

      숫자로 시작하면 안 되고, '$'와 '_'를 제외한 특수 문자를 사용하지 말아야 한다.

      관례적으로 메소드 명은 소문자로 작성한다.

      서로 다른 단어가 혼합된 이름이라면 뒤이어 오는 단어의 첫머리 글자는 대문자로 작성한다.

  • 접근 제어자

    • public: 모든 패키지에서 해당 클래스로 접근가능
    • protected: 상속받은 클래스에서 접근가능
    • private: 자신을 포한한 패키지에서만 해당 클래스로 접근 가능

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

new Car();

Car car; //// 메모리에 참조변수 car를 위한 공간 생성
car = new Car(); //  인스턴스생성 및 대입 (인스턴스화)
Car car = new Car();

new 연산자로 생성된 객체는 메모리 힙 영역에 생성되고

객체의 주소를 리턴하는데 이 주소를 참조 타입인 클래스 변수에 저장하고

변수를 통해 객체를 사용한다. 클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화라고 하며,

클래스로부터 만들어진 객체를 클래스의 인스턴스라고한다.

클래스의 인스턴스화


메소드 정의하는 방법

표준 틀

public class 클래스이름 {
  리턴타입 메소드이름 ([매개변수, ...]) {
    메소드 실행 블록
  }
}

public class Car{
    int battery;
    String engine;

  void charge(){
        System.out.println("no charge");   
 }

  // 매개변수의 수를 모를 경우
  void charge(int... values){
    // int[] values == int...values

    for(int i = 0; i < values.length; i++){
         System.out.println("charge  "+i);   
    }
  }

메소드는 오버로딩이 가능하다.

오버로딩

같은 함수 이름을 가지고 있으나 매개변수, 리턴타입 등의 특징은 다른 여러개의 서브프로그램 생성을 가능하게 한다


생성자 정의하는 방법

new 연산자로 호출되는 특별한 중괄호 {} 블록이다.

생성자의 역할은 객체 생성 시 필드를 초기화하고, 메소드를 호출해 객체를 사용할 준비를 한다.

클래스 이름으로 되어있고 리턴 타입이 없다.

생성자도 오버로딩을 제공한다

표준 틀

클래스 ([매개변수선언, ...]){
  // 객체의 초기화 코드
}
 .
public class Car {
        int speed;
      String color;
    Car(){
                color = getDefaultColor();
                speed =0;
        }
    Car(String color){}
    Car(int speed){}
    Car(String color, int speed){}
        String getDefaultColor(){
    return "blue";
  }
}

( jeeneee.dev/java-live-study/week5-class/  )

(에서 참고한 신 개념)

초기화 블록(initializer) - 초기화 블록 내에서는 조건문, 반복문 등을 사용해 명시적 초기화에선 불가능한 초기화를 수행할 수 있다.

  • 클래스 초기화 블록 - 클래스 변수 초기화에 쓰인다.
  • 인스턴스 초기화 블록 - 인스턴스 변수 초기화에 쓰인다.

    클래스 변수 초기화: 기본값 → 명시적 초기화 → 클래스 초기화 블록
    인스턴스 변수 초기화: 기본값 → 명시적 초기화 → 인스턴스 초기화 블록 → 생성자

접근 제어자 - public, protected, default, private
그 외 - static, final, abstract, transient, synchronized, volatile etc.

static이나 public같은 키워드를 제어자(modifier)라고 하며, 클래스나 멤버 선언 시 부가적인 의미를 부여한다.

  • 접근 제어자 - 접근 제어자는 해당 클래스 또는 멤버를 정해진 범위에서만 접근할 수 있도록 통제하는 역할을 한다. 클래스는 public과 default밖에 쓸 수 없다. 범위는 다음과 같다. 참고로 default는 아무것도 덧붙이지 않았을 때를 의미한다.

  • static - 변수, 메서드는 객체가 아닌 클래스에 속한다.
  • final

    • 클래스 앞에 붙으면 해당 클래스는 상속될 수 없다.
    • 변수 또는 메서드 앞에 붙으면 수정되거나 오버라이딩 될 수 없다.
  • abstract

    • 클래스 앞에 붙으면 추상 클래스가 되어 객체 생성이 불가하고, 접근을 위해선 상속받아야 한다.
    • 변수 앞에 지정할 수 없다. 메서드 앞에 붙는 경우는 오직 추상 클래스 내에서의 메서드밖에 없으며 해당 메서드는 선언부만 존재하고 구현부는 상속한 클래스 내 메서드에 의해 구현되어야 한다. 
  • transient - 변수 또는 메서드가 포함된 객체를 직렬화할 때 해당 내용은 무시된다.
  • synchronized - 메서드는 한 번에 하나의 쓰레드에 의해서만 접근 가능하다.
  • volatile - 해당 변수의 조작에 CPU 캐시가 쓰이지 않고 항상 메인 메모리로부터 읽힌다.
class Class {               // 클래스
    String constructor;
    String instanceVar;     // 인스턴스 변수
    static String classVar; // 클래스 변수

    static {                // 클래스 초기화 블록
        classVar = "Class Variable";
    }

    {                       // 인스턴스 초기화 블록
        instanceVar = "Instance Variable";
    }

    Class() {                // 생성자
        constructor = "Constructor";
    }

    void instanceMethod() {       // 인스턴스 메서드
        System.out.println(instanceVar);
    }

    static void classMethod() {   // 클래스 메서드
        System.out.println(classVar);
    }
}

this 키워드 이해하기

  • this는 객체 자신을 의미한다. 인스턴스의 주소가 저장되어 있다.

  • 객체 내부에서 필드에 접근하기 위해 this를 사용할 수 있다. 즉, this 는 클래스 내부 속성을 나타낸다.

  • 주로 생성자와 메소드의 매개변수 이름이 필드와 동일한 경우 필드를 명시하기 위해 사용된다.

  • 한 생성자에서 다른 생성자를 호출한다. 단, 반드시 첫 줄에서만 호출이 가능하다.

  • 생성자 내에서 다른 생성자를 호출할 때 클래스 이름 대신 this를 사용해야한다.

public class Car {
  String color;
  int speed;

  Car (String color){
    this(color, 10);
  }

  Car (String color, int speed){
    // 매개변수를 객체의 필드에 대입한다.
    this.color = color;
    this.speed = speed;
  }
}


참고 문헌

https://ko.wikipedia.org/wiki/클래스_(컴퓨터_프로그래밍)

https://blog.naver.com/ljseokd/222171753866

https://ko.wikipedia.org/wiki/객체_지향_프로그래밍

https://gblee1987.tistory.com/195

jeeneee.dev/java-live-study/week5-class/

github.com/ByungJun25/study/tree/main/java/whiteship-study/5week

반응형

'스프링, 자바' 카테고리의 다른 글

java 의 collection  (0) 2020.12.24
JVM 에 대해서  (2) 2020.12.24
스프링 IoC 컨테이너와 빈 개념  (0) 2020.12.18
스프링 프레임워크 핵심 기술. 0강. 소개  (0) 2020.12.18
jwt 자바  (0) 2020.12.04
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함