본문 바로가기
JAVA

클래스

by e-pd 2020. 12. 15.

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

 

 

 

클래스를 정의하는 방법

 

클래스란? 

  • 새로운 개체를 만들 때 명세
  • 개체는 클래스로부터 만들어져야함

명세서(속성, 동작)

 

Duck.java (상태와 동작을 가진 Duck 클래스)

1
2
3
4
5
6
7
8
9
public class Duck {
    private String name;
    private int age;
 
    public void fly() {
        System.out.println("오리 날다");
    }
}
 
cs

 

속성(상태)를 표현하는 용어

  • member variable
  • field
  • attribute

 

동작을 표현하는 용어

  • member function
  • method
  • message

객체를 만드는 방법

java.ihoney.pe.kr/23

 

Java에서 인스턴스(객체)를 만드는 다양항 방법

Java에서는 다음과 같이 인스턴스(객체)를 만드는 방법이 있다.  new 일반적으로 인스턴스는 Java의 예약어 new를 사용해서 만든다. 다음과 같이 하면 Something 클래스의 인스턴스를 만들고 변수 obj에

java.ihoney.pe.kr

1) new

Something object = new Something();
//object 이름을 가지는 Something 클래스 타입의 객체를 가짐

일반적으로 Java 예약어 new를 사용하여 인스턴스를 만든다. 

new 연산자는 new연산자 뒤에 나오는 생성자를 이용해 메모리에 객체를 만들라는 예약어이다.

 

2) Clone

clone 메서드를 이용하면 이미 존재하는 인스턴스를 바탕으로 새로운 인스턴스 생성가능

1
2
3
4
5
public App cloneObj() throws CloneNotSupportedException {
        App obj = null;
        obj = (App) clone();
        return obj;
}
cs

 

3) newInstance

Class 의 인스턴스를 기초로 Class가 표시하는 클래스의 인스턴스를 만들 수 있음

1
2
3
4
5
6
  public static void main(String[] args) throws IllegalAccessException, InstantiationException {
        App app = new App();
        App newInstance = app.getClass().newInstance();
        System.out.println(app == newInstance);
    }
 
cs

 

자바 9부터는 newInstance() 메서드가 deprecated되었다. 

Class.getDeclaredConstructor(...).newInstance(...)

 

1
2
3
4
5
 public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        App app = new App();
        App newInstance = app.getClass().getDeclaredConstructor().newInstance();
        System.out.println(app == newInstance);
    }
cs

 

instance

클래스에 속하는 객체의 예

 

instantiation

클래스로부터 개체 하나를 만드는 행위

 

1
2
3
4
5
6
7
public static void main( String[] args) {
        Duck duck = new Duck();
        duck.name = "오리";
        duck.age = 10;
        duck.fly();
    }
 
cs

접근제한자를 두지 않았다면

.연산자를 통해 객체의 멤버 변수, 맴버 함수를 접근할 수 있다.

 

하지만 위와 같이 생성후 따로 값을 대입하면 유효하지 않은 값을 가질 수 있다.

따라서 생성시 올바른 값으로 초기화할 필요성이 생긴다.

 

객체와 클래스 좀 더 고민해볼점

붕어빵 붕어빵 = new 붕어빵(); 

이대로 괜찮은가?

 

smujihoon.tistory.com/225

 

클래스 vs 객체 = 붕어빵틀 vs 붕어빵?

붕어빵과 붕어빵틀 처음 Java를 접하게 될 경우 객체와 클래스에 관해 설명을 위와같이 들어본 사람이 아마 대다수 일 것이다. 하지만 이것은 쉽게 설명하려고 하다보니 생긴 오류다. 개발을 할

smujihoon.tistory.com

 

 


메서드를 정의하는 방법

메서드?

클래스 내부의 함수를 method라고 한다.

 

함수는 입력값에 따라 출력값을 만들어 내는 ‘블랙 박스’와 같다.

 

접근제어자 반환형 함수명(매개변수 목록) {
	...
    return 리턴값;
}

 

접근제어자

private : 외부 접근 금지

public : 누구나 접근 가능

default : 같은 패키지에 속한 클래스만 접근 가능

protected : 상속받은 자식들만 접근가능

 

 

메서드 시그니쳐

매서드이름과 매개변수 리스트의 조합

 

Java는 VM수준에서 메서드와 클래스를 식별하는데 시그니처가 사용

컴파일 시간에 parameters의 type의 정확성을 검사

 

developer.mozilla.org/ko/docs/Glossary/Signature/Function

 

Signature (functions) - 용어 사전 | MDN

함수 시그니처(타입 시그니처, 메소드 시그니처)는 functions 그리고 methods의 입력과 출력을 정의합니다. 시그니처는 다음을 포함합니다: parameters와 그들의 types 반환값과 타입 던져지거나 콜백

developer.mozilla.org

method는 입출력 유무에 따라 4가지 종류로 구분할 수 있다.

입력 0 출력 0 메서드 
입력 X 출력 O 메서드
입력 O 출력 X 메서드
입력 X 출력 X 메서드

 

 

리턴 자료형이 void형일 경우 리턴으로 메서드를 빠져나갈 수 있다. 

1
2
3
4
5
6
  public void study(String condition) {
        if (condition.equals("100%")) {
            return;
        }
        System.out.println("현재 스터디 중");
    }
cs

 

Local variable

메서드 내에서만 쓰이는 변수

 

 

 

 


생성자를 정의하는 방법

(접근 제어자가 꼭 public일 필요는 없음)

public 클래스이름(매개변수 목록) {
	...
}
  • 개체 생성시 자동으로 호출되는 함수
  • 반환형은 없음(void와는 다름)

생성자 생성시 참고사항

  • 맴버 변수는 private
  • 생성자의 매개변수는 유효한 값이 되도록한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Duck {
    private String name;
    private int age;
 
    public Duck() {
    }
 
    public Duck(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    public void fly() {
        System.out.println("오리 날다");
    }
}
 
cs

 

생성자의 오버로딩도 가능하다

하지만 중복을 피하기 위해서 매개변수가 적은 생성자에서 매개변수 수가 많은 생성자를 호출하여

중복코드를 제거하는 것이 좋다. this()를 사용해 다른 생성자를 호출 가능하다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Duck {
    private String name;
    private int age;
 
    public Duck() {
        this(null0);
    }
 
    public Duck(String name, int age) {
        this.name = name;
        this.age = age;
    }
 
    public void fly() {
        System.out.println("오리 날다");
    }
}
 
cs

 

default constuctor

public 클래스명() {
	...
}

 

생성자를 하나도 안만들 경우 자동으로 생기는 생성자

컴파일러가 알아서 매개변수 없는 생성자를 만들어준다(생성자를 개발자가 제공하면 기본 생성자는 생기지 않는다)

 

Getter / Setter

 

Getter

public 반환형 get ...() {
	return private 멤버변수;
}

Setter 

public void set ...(멤버 변수 자료형 인자명) {
	멤버변수 = 인자명;
}

함수를 통한 접근의 장점 

  • 필요할 때마다 getter에서 계산 가능
  • setter에서 로직 처리 가능
  • 상속을 통한 다형성

 


This 키워드 이해하기

  • 인스턴스 자기 자신를 가리키는 키워드.
  • 현재 오브젝트를 참조

docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html

 

Using the this Keyword (The Java™ Tutorials > Learning the Java Language > Classes and Objects)

The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Java Language Changes for a summary of updated

docs.oracle.com

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class App {
 
    public App returnThis() {
        return this;
    }
 
    public static void main(String[] args)  {
        App app = new App();
        System.out.println(app);
        System.out.println(app.returnThis());
        System.out.println(app == app.returnThis());
    }
 
 
}
cs

실행결과

App@6bf256fa
App@6bf256fa
true

 

 

this 를 사용함으로서 클래스 맴버변수와 인자가 헷갈리는 것을 방지한다.

(변수, 메서드, 클래스, 인터페이스의 이름을 같은 영역에서 동일하게 사용하면 이름이 겹치고 섀도윙 발생함

쌔도윙이 되면 대상을 이름으로 접근 할 수 없다)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class App {
    int x;
 
    public App(int x) {
        x = x;
    }
 
    public int getX() {
        return x;
    }
 
    public static void main(String[] args)  {
        App app = new App(5);   
        System.out.println(app.getX());   // 0
    }
 
 
}
cs

this를 쓰지않으면 값이 5가 아닌 0이 나온다.

 

 

'JAVA' 카테고리의 다른 글

패키지  (0) 2020.12.28
상속  (0) 2020.12.21
Java 코딩의 기술-4  (0) 2020.12.06
Java 코딩의 기술-3  (0) 2020.12.05
JUnit5  (0) 2020.12.05