JaeWon's Devlog
article thumbnail
반응형

- 해당 내용은 백기선 님의 자바 온라인 스터디 공부 및 제출 목적

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

 

5주차 과제: 클래스 · Issue #5 · whiteship/live-study

목표 자바의 Class에 대해 학습하세요. 학습할 것 (필수) 클래스 정의하는 방법 객체 만드는 방법 (new 키워드 이해하기) 메소드 정의하는 방법 생성자 정의하는 방법 this 키워드 이해하기 마감일시

github.com


목표

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

학습할 것 (필수)

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

1. 클래스 정의하는 방법

  • 클래스(Class) 란?
    - 객체들의 협력 관계를 코드로 옮기는 도구.
    - 객체지향 프로그래밍에서 객체를 정의해주는 틀.
  • Java에서의 클래스
    - 필드, 생성자, 메소드로 구성.
    • 필드(Field) : 객체지향에서 속성에 해당하며, 데이터가 저장되는 공간.(=멤버 변수).
    • 생성자(Constructor) : 변수에 초기값을 대입하여 사용하는 것처럼, 클래스도 동일한 형식으로 생성하여 초기화를 해주는 역할.
    • 메소드(Method) : 객체지향에서 기능(행위)에 해당하며, 클래스를 사용하여 메소드 내에서 정의된 행위를 실행.

  • 위의 그림을 예로 들어보면 "과일"이란 Class 는, "사과, 수박, 바나나"라는 필드(변수)가 있으며, "판매"라는 메소드로 구성되어 있다.
  • 위의 클래스 예제를 코드로 작성하면 아래와 같습니다.
// 클래스
public class Fruit {

    // 필드(멤버변수)
    String apple;
    String watermelon;
    String banana;
    
    // 기본 생성자(생략 가능)
    public Fruit(){
    }
    
    // 파라미터를 가진 생성자(생략 불가능)
    public Fruit(String apple){
    	this.apple = apple;
    }
    
    //	메소드
    public String getApple(){
    	return this.apple;
    }
    public void setApple(String apple){
    	this.apple = apple;
    }
    
    public int sale(String apple){
    	return apple * 10000;
    }
}
  • 접근 지정자
    • 자바(Java) 에서는 클래스를 생성(정의)할 때 class 라는 키워드를 사용
    • 접근 지정자 : 외부클래스에서 해당 클래스에 접근하는 범위를 제한
    • public, protected, default, private
접근 지정자 클래스 내부 동일 패키지(폴더) 하위 클래스 그 외 영역
public O O O O
protected O O O X
default O O X X
private O X X X

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

  • 객체 만들기
    - 정의한 클래스를 사용하기 위해서는 클래스로부터 객체를 생성해야 사용이 가능하다.(클래스 인스턴스화)
    - new 키워드를 통해 객체를 만든다.
    - new 키워드를 사용하면 메모리 힙 영역에 데이터를 저장할 영역을 할당 받고, 해당 영역의 주소를 객체에게 반환.
    - 클래스의 구조 중 "생성자"는 객체 생성에 사용된다.
  • 위에서 만든 Fruit 클래스를 객체로 생성하는 코드는 아래와 같다.
public static void main(String[] args){
    String apple;

    // 기본 생성자로 객체 생성
    Fruit fruit = new Fruit();
    
    // 파라미터를 가진 생성자로 객체 생성
    Fruit fruit_2 = new Fruit(apple);
}

3. 메소드 정의하는 방법

  • 클래스 내부의 메소드는 선언(=정의)과 호출(=실행)으로 구성.
  • 선언 : 접근지정자, 리턴타입, 메소드명, 파라미터로 구성.
  • 호출 : 메소드의 기능을 호출하여 실행.
  • 메소드는 리턴타입이 있을 수 있고, 없을 수도 있다.
  • 매개변수(파라미터)도 있을 수 있고, 없을 수도 있다.
// 접근지정자 리턴타입 메소드명(파라미터)
// 리턴 O, 매개변수 X
public String getApple(){
	return this.apple;
}

// 리턴 X, 매개변수 O
public String setApple(String apple){
	this.apple = apple;
}

3-1. 메소드 오버로딩(Method Overloading)

  • 파라미터(매개변수)의 갯수나 타입이 다른 경우에 동일한 이름의 메소드명을 사용해 메소드를 재정의.
  • 파라미터는 동일하고, 리턴 타입이 다른 경우에는 메소드 오버로딩이 성립하지 않음.
  • 리턴 타입과 파라미터의 이름이 오버로딩에 영향을 주지 않음.
  • 대표적으로, System.out.println()
  • 메소드 오버로딩을 사용하면, 하나의 이름으로 다양한 기능을 사용할 수 있어 편의성을 더해줌.
// 같은 이름의 메소드지만 행위는 다르다.
public String getApple(){
	return this.apple;
}

public String getApple(String banana){
	this.apple = banana;
	return this.apple;
}

// 파라미터의 값에 따라 결과가 다르다.
System.out.println("메소드");
System.out.println("오버라이딩");

3-2. 메소드 오버라이딩(Method Overriding)

  • 상위 클래스가 정의한 메소드를 하위 클래스가 가져와 행위를 변경하거나 확장.
  • 하위 클래스에서 상위 클래스의 메소드를 재정의하는 기법.
  • 상위 클래스의 메소드를 하위 클래스에서 재정의하여 사용하기 때문에, 확장과 변경에 용이함.
public class Fruit{
	public void hello(){
    	System.out.println("나는 과일입니다.");
    }
}

public class banana extends Fruit{
    // Fruit 클래스의 hello 메소드를 오버라이딩하여 새로 정의
    @Override
    public void hello(){
    	System.out.println("나는 과일 중 바나나입니다.");
    }
}

4. 생성자를 정의하는 방법

  • 클래스를 생성하고 객체를 호출할 때 객체를 초기화하기 위해 사용.
  • 기본 생성자, 묵시적 생성자, 명시적 생성자로 구분.
    • 기본 생성자 : 클래스 내부에 선언된 생성자가 없는 경우. 객체 생성 시 컴파일러가 자동으로 생성해주는 생성자.
    • 묵시적 생성자 : 파라미터 값을 가지지 않는 생성자.
    • 명시적 생성자 : 파리미터 값을 가지는 생성자.
  • 메소드와 비슷하지만, 클래스 이름으로 되어있으며, 리턴 타입이 없다.
  • 모든 클래스는 생성자를 가진다.(생략하면 컴파일러가 자동으로 기본 생성자를 생성)
// 기본 생성자(생략 가능)
public Fruit(){
}

// 묵시적 생성자
public Fruit(){
	System.out.println("묵시적 생성자");
}

// 명시적 생성자
public Fruit(String apple){
	this.apple = apple;
}

5. this 키워드 이해하기

  • 객체 자신을 의미.
  • 클래스가 인스턴스화 되었을 때, 자기 자신의 메모리 주소를 가진다.
  • 클래스 내부의 필드 이름과 메소드를 통해 넘어온 파라미터의 변수명이 같은 경우, this 키워드를 이용하여 구분할 수 있다.
  • 객체 내부에서 필드에 접근하기 위해 this 를 사용할 수 있다.
public class Fruit{
	String apple;

	public String setApple(String apple){
    	// this를 통해 해당 클래스에서 apple의 변수를 가져온다.
    	this.apple = apple;
    }
}

참고

- https://www.notion.so/Live-Study-5-75f857b63e524d33914a8b3ec6e1e894

- https://k3068.tistory.com/29

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

반응형
profile

JaeWon's Devlog

@Wonol

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!