[자바스터디] 5. 클래스

피오·2021년 8월 30일
0

자바 스터디

목록 보기
3/4

객체지향이란

객체지향이론의 기본 개념은 실제 세계가 사물(객체)로 이루어져 있으며, 발생하는 모든 사건들이 사물간의 상호작용이라는 것이다. 그리고 그러한 상호작용(관계)를 프로그래밍 언어로서 구현한 것이 객체지향 언어이다.

  • 프로그래밍에서 객체는 클래스에 정의된 내용대로 메모리에 생성된 것을 뜻함

  • 객체지향 언어의 주요특징
    1. 코드의 재사용성이 높다.
    2. 코드 유지보수가 용이하다.
    3. 중복 코드를 방지한다.


클래스

  • 클래스란 객체를 정의해 놓은 것이며, 객체를 생성하는 데 사용된다.
  • 클래에는 객체의 모든 속성과 기능(메서드)가 정의되어 있어야 한다.

클래스 정의 방법

class CoffeeMachine {
    //CoffeeMachine클래스의 멤버변수(=속성)
    int price; //가격
    String productCode; //제품 코드
    String colorCode; //색상 코드
  		
    //생성자
    public CoffeeMachine(int price, String productCode, String colorCode) {
    	price = price;
        productCode = productCode;
        colorCode = colorCode;
    }
    
    //커피를 만드는 메서드
    public Coffee makeCoffee(CoffeeBean bean) {
    	...
    	return coffee;
    }
    
    
}
  1. 클래스명은 대문자로 시작한다.
    class CoffeeMachine

  2. 초기화가 필요한 멤버변수를 위해 생성자를 선언한다.
    public CoffeeMachine(int price, String productCode, String colorCode) {...}
    선언된 생성자가 없는 경우 파라미터와 몸통부분이 비어있는 default 생성자가 호출된다.

  3. 객체에 어떤 기능이 있는 경우 기능을 구현한 메소드를 선언한다. 메소드에는 반환형을 명시해줘야 한다.
    public Coffee makeCoffee(CoffeeBean bean) {...}


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


메서드

  • 메서드란? 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것.

메서드 정의 방법

  • 메서드는 선언부와 구현부로 이루어져있다.
반환타입 메서드명 (타입 변수명, ...)  //선언부
{
	//구현부
}

public Coffee makeCoffee(CoffeeBean bean)  //선언부
{
	//구현부
    	...
        
        //반환되는 변수 coffee의 타입은 선언부에 적힌 것과 같이 Coffee타입 이거나
        //Coffee타입으로 자동 형변환될 수 있는 타입이어야 한다.
    	return coffee; 
        
}
  • 매개변수를 입력할 때 타입을 적어줘야 하며, 같은 타입의 매개변수를 여러개 입력하는 경우에도 타입은 다 적어줘야 한다.
    cf. 매개변수도 지역변수이다.

  • 메서드가 반환하는 게 없다면 반환타입을 void로 선언한다.


생성자

  • 생성자란? 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드.
    (인스턴스 초기화 = 인스턴스변수 초기화)
  • 리턴타입이 없다.
  • 인스턴스 생성 주체 ? 생성자(x) new 연산자(o)
  • 생성자도 오버로딩이 가능하다.
  • 인스턴스 생성 과정
    1. 연산자 new에 의해 힙 메모리에 클래스의 인스턴스가 생성됨.
    2. 생성자 클래스명()가 호출되어 수행됨.
    3. 연산자 new의 결과로, 생성된 클래스 인스턴스의 주소가 반환되어 참조변수에 저장된다.

생성자 정의 방법

  • 기본 생성자
    • 매개변수도 없고, 아무 내용도 없는 생성자. 클래스명() {}
    • 딱히 인스턴스를 초기화할 필요가 없는 경우 사용.
    • 생성자가 하나도 선언되지 않은 경우 컴파일러가 자동으로 기본 생성자를 작성해준다.
    • 생성자가 하나라도 선언되어 있다면 컴파일러가 자동으로 작성해주지는 않는다.
  • 매개변수가 있는 생성자
    • 매개변수를 받아 인스턴스 생성과 동시에 초기화를 수행.
    • 클래스 작성시 여러 생성자를 작성하여, 인스턴스 생성 후 별도 초기화 과정을 거치지 않아도 되게 하는 것이 바람직.
public CoffeeMachine() {}
public CoffeeMachine(int price, String productCode, String colorCode) {
	price = price;
	productCode = productCode;
	colorCode = colorCode;
}

this

1. this(), this(매개변수) : 같은 클래스의 다른 생성자를 호출하는 this

  • 생성자 내에서 같은 클래스의 다른 생성자를 호출하는 것이 가능하다.
    • 규칙
      • 클래스 이름 대신 this사용
      • 첫 줄에서만 호출 가능. 첫 줄을 넘어가면 인스턴스 초기화 도중에 또 다시 초기화를 시작하는 것이므로 이전 초기화 작업이 무의미해질 수 있음.
public CoffeeMachine(int price, String productCode) {
	this(price, productCode, "#000000);
    	// 가격과 제품 코드만 입력받은 생성자는 내부에서 디폴트 색상코드를 입력하여
        // 생성자를 한번 더 호출.
};

public CoffeeMachine(int price, String productCode, String colorCode) {
	this.price = price;
    	this.productCode = productCode;
        this.colorCode = colorCode;
}

2. 생성자에서 인스턴스 변수를 초기화할 때 this

public CoffeeMachine(int p, String pc, String cc) {
	price = p;
    	productCode = pc;
        colorCode = cc;
}

위 코드에서는 인스턴스 변수 price와 지역변수 p의 변수명이 구별되므로 문제가 없다.

public CoffeeMachine(int price, String productCode, String colorCode) {
	this.price = price;
    	this.productCode = productCode;
        this.colorCode = colorCode;
}

하지만 위 코드와 같이 작성하는 경우 인스턴스 변수명과 지역변수명이 같기 때문에 두 변수가 구별되지 않는다. 이런 경우에 인스턴스 변수에 this를 붙이면 된다.
이때 this는 참조변수로 인스턴스 자신을 가리키며(인스턴스의 주소가 저장되어 있음) 모든 인스턴스 메서드에 지역변수로 존재한다(숨겨진 상태).

초기화 블럭

  • 초기화 블럭 내에는 조건문, 반복문, 예외처리구문 등을 사용할 수 있기 때문에 클래스/인스턴스 변수가 복잡한 초기화 로직을 필요로 할 때 사용된다.
  • 인스턴스 초기화 블럭에는 모든 생성자에서 공통으로 수행되는 코드를 넣어서 중복 코드를 제거한다.

과제

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

참고서적
profile
블로그 이전했습니다. https://pzbg.tistory.com/

0개의 댓글