[Java] 클래스

케이·2022년 8월 21일
0

JAVA

목록 보기
9/17
post-thumbnail

학습한 내용을 정리한 포스팅입니다. 참고 문헌 내용이 직역 되어 어색한 문장이 있을 수 있습니다. 틀린 내용이 있다면 지적해주시면 감사하겠습니다. 🙇🏻‍♀️

클래스 정의하는 방법

아래의 예제가 클래스 정의다.
중괄호 사이의 공간이 클래스 바디이고 클래스 바디는 클래스로부터 생성되는 객체의 라이프 사이클 동안 포함될 모든 코드를 담는다.

class Myclass {
		// field, constructor, and
		// method declartions
}

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

Point originOne = new Point(23, 94);
Rectangle rectOne = new Rectangle(originOne, 100, 200);
Rectangle rectTwo = new Rectangle(50, 100);
  1. Declaration: 위의 코드에서 '=' 기호 기준 왼쪽 부분이 변수 선언들이다.
  2. Instantiation: new 키워드는 객체를 만드는 자바 오퍼레이터이다.
  3. Initialization: new 오퍼레이터는 새로운 객체를 초기화 시키는 생성자가 호출되는 것을 따르게 된다.

Declaring a Variable to Refer to an Object

Point originOne;이라고만 한다면 객체를 실제로 생성해서 할당하기 전까지는 아무일도 일어나지 않는다. 단순히 선언만 하는 것은 객체를 생성하지 않는다. 객체를 생성하기 위해서는 new 오퍼레이터가 필요하다.

Instantiating a Class

new 오퍼레이터는 메모리에 새로운 객체를 할당함으로써 클래스를 인스턴스화 한다. 또 객체 생성자를 호출한다.

참고: ‘클래스를 인스턴스화(instantiating)’ 한다는 말은 객체를 생성한다는 말과 같다. 객체를 생성할 때 클래스의 인스턴스(instance)를 생성하기 때문이다.

new 오퍼레이터는 생성된 객체의 레퍼런스를 반환단다. 이 레퍼런스는 주로 알맞은 타입의 변수로 할당된다.
예시) Point originOne = new Poing(23,94);

Initializing an Object

public class Point {
    public int x = 0;
    public int y = 0;
    //constructor
    public Point(int a, int b) {
        x = a;
        y = b;
    }
}

위의 경우는 클래스가 생성자를 하나만 갖고 있는 경우이다. 이와 달리 생성자가 여럿인 경우 자바 컴파일러가 각 생성자를 구분해서 알맞은 생성자를 사용하게 된다.

Rectangle rect = new Rectangle();

위와 같은 예시에서는 변수(arguments)를 하나도 사용하지 않는 경우에 해당되고 이 때는 no-argument 생성자를 호출하게 된다.


메소드 정의하는 방법

public double calculateAnswer(double wingSpan, int numberOfEngines,
								double length, double grossTons) {

	//계산식 위치할 자리
}

메소드를 정의할 때 메소드의 리턴타입과 이름, 중괄호와 중괄호 안의 바디 내용이 필요하다.

좀 더 일반적으로 메소드 정의는 여섯가지의 컴포넌트를 순서대로 갖는다

  1. Modifiers - public, private 등등
  2. The return type - 메소드에 의해서 리턴 될 값의 데이터 타입이나 void(메소드가 어떤 값도 리턴하지 않을 때)
  3. The method name - 컨벤션이 살짝 다르긴 하지만 필드명 규칙이 메서드명에도 적용된다.
  4. The parameter list in parenthesis - 파라미터가 없는 경우 () 빈 괄호로 두면 된다.
  5. An exception list
  6. The method body, enclosed between braces

메소드 네이밍

컨벤션에 따르면 메소드명은 (소문자)동사거나 (소문자)동사로 시작하는 여러단어로 이루어진 이름이면 된다. 메소드명이 여러단어로 이루어졌을 때는 두번째 단어부터 단어의 첫글자는 대문자여야한다.

예시) runFast, getBackGround 등등

오버로딩 메소드

자바는 오버라이딩 메소드를 지원하고 각각 다른 메소드 시그니처에 따라서 메소드들을 구분할 수 있다. 즉 같은 클래스 내의 메소드들이 다른 파라미터들을 갖는다면 같은 이름을 가질 수 있다는 것이다.

public class DataArtist {
    ...
    public void draw(String s) {
        ...
    }
    public void draw(int i) {
        ...
    }
    public void draw(double f) {
        ...
    }
    public void draw(int i, double f) {
        ...
    }
}

오버로드된 메소드들은 인수의 타입과 갯수를 바탕으로 구분된다. 예를 들어 위의 코드 샘플에서 draw(String s)와 draw(int i)는 각각 다른 타입의 변수(arguments)를 요구하기 때문에 각각 다른 메소드로 구분된다.


생성자 정의하는 방법

모든 클래스들은 적어도 하나의 생성자를 갖는다. 만약 클래스에서 어떤 생성자도 정의하지 않는 다면 자바 컴파일러는 자동으로 기본 생성자인 no-argument 생성자를 제공한다.

이 기본 생성자는 클래스 부모의 no-argument 생성자를 호출하거나 클래스의 부모가 없는 경우엔 Object의 생성자를 호출한다.


this 키워드 이해하기

this 키워드는 클래스가 가지고 있는 속성 자신을 가리킬때 쓴다. 예를 들어

public class Animal {
	
	public String name;
	public int legs;

	public animal (String name, int legs) {
		this.name = name;
		this.legs = legs;
	}
}

위와 같은 코드가 있다고 했을 때 this.name이 가리키는 것은 animal class의 name이다. 그 뒤에 나온 name은 변수로 받은 name을 말한다. 즉 변수로 받은 name을 이 클래스 속성 name필드의 값으로 쓰겠다는 의미가 된다.


참고

https://docs.oracle.com/javase/tutorial/java/javaOO/classdecl.html

https://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html

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

profile
삽질하며 깨닫고 배웁니다. (a.k.a 프로삽질러) + 이 구역의 회고왕

0개의 댓글