목표
자바의 Class에 대해 학습하세요.
학습할 것 (필수)
- 클래스 정의하는 방법
- 객체 만드는 방법 (new 키워드 이해하기)
- 메소드 정의하는 방법
- 생성자 정의하는 방법
- this 키워드 이해하기
과제 (Optional)
- int 값을 가지고 있는 이진 트리를 나타내는 Node 라는 클래스를 정의하세요.
- int value, Node left, right를 가지고 있어야 합니다.
- BinrayTree라는 클래스를 정의하고 주어진 노드를 기준으로 출력하는 bfs(Node node)와 dfs(Node node) 메소드를 구현하세요.
- DFS는 왼쪽, 루트, 오른쪽 순으로 순회하세요.
클래스를 정의하는 방법
객체 지향 프로그래밍(OOP, Object-Oriented Programming)은 모든 데이터를 객체로 취급하는 프로그래밍 패러다임의 한 종류이다.
흔히 객체를 설명할 때 실제로 우리가 인식하는 사물을 예로 든다. 이 사물들의 상태와 행동을 구체화하는 것이 OOP이며, 이 사물(객체)를 만들어내는 설계도를 클래스(Class)라고 한다.
클래스는 객체의 대표 이름을 사용하며 아래의 규칙에 따라 지정해야한다.
1. 강제되는 규칙
- 첫 문자가 문자 또는 '_' , '$' 로 시작해야하며, 숫자로 시작할 수 없다.
- 첫 문자가 아닐 경우에는 문자, 특수문자, 숫자 모두 사용 가능하다.
- 자바 예약어는 식별자로 사용할 수 없다.
- 공백을 포함할 수 없다.
2. 강제되지는 않으나 대부분의 개발자들이 준수하므로 지켜야하는 규칙
- 반드시 대문자로 시작한다.
- 해당 클래스가 어떤 목적을 가지고있는지 유추할 수 있도록 한다.
- 파스칼케이스 명명규칙 또는 카멜케이스 명명규칙을 따른다.
또한, 하나의 *.java 파일에서 여러개의 클래스를 정의할 수 있지만 파일명과 동일한 이름의 클래스에만 public 접근제한자를 붙일 수 있고, 개발 시 가독성과 유지보수 측면에서 하나의 파일에 하나의 클래스만을 정의하는 것을 권장한다.
이 포스팅에서는 자동차(사물)를 객체화하기 위해 Car 클래스를 작성했다.
public class Car
{
// 필드
private String modelName;
private String color;
private int maxSpeed;
private String ownerName;
// 생성자 (without parameters)
public Car()
{
}
// 생성자 (with parameters)
public Car(String modelName, String color, int maxSpeed, String ownerName)
{
this.modelName = modelName;
this.color = color;
this.maxSpeed = maxSpeed;
this.ownerName = ownerName;
}
// 메소드
public void accelerate (int speed)
{
int current = 0;
int maximum = (speed > this.maxSpeed)? this.maxSpeed : speed;
while (current <= maximum)
{
System.out.printf("부릉부릉~~ %d km/h", current);
current++;
}
}
}
클래스는 필드와 메소드, 생성자로 구성되는데, 필드는 객체의 상태를 나타내고 메소드는 객체의 행동을 나타낸다. 생성자는 클래스가 객체가 될 때 초기화 역할을 한다.
필드
- 객체의 상태를 나타낸다.
- 클래스의 중괄호 내에 어디든 존재할 수 있다.
- 객체와 동일한 생명 주기를 갖는다.
생성자
- 클래스에 반드시 존재하며, 하나의 클래스에 여러 생성자를 가질 수 있다.
- 생성자 선언을 생략하면 컴파일러가 자동으로 내용이 비어있는 생성자를 추가한다.
- 메소드와 형태가 유사하나 클래스 명으로 되어있고 반환 타입이 없다.
메소드
- 객체의 행동을 나타낸다.
- 호출 시 메소드의 중괄호 내 코드가 실행되며 외부로부터 매개변수를 받고 값을 반환할 수 있다.
객체를 만드는 방법
객체는 new 연산자를 통해 클래스를 인스턴스화해 메모리 힙 영역에 저장하고 그 주소 값을 반환한다.
public class Main
{
public static void main(String[] args)
{
// 빈 생성자 사용
Car carA = new Car();
// 파라미터를 받는 생성자 사용
Car carB = new Car("MyCar", "black", 200, "1hoon");
}
}
클래스가 인스턴스화되는 과정은 아래와 같다.
- 메모리에 참조변수 carA를 위한 공간 확보(Stack 영역)
- Heap 영역에 새로운 Car 인스턴스가 생성된다.
- 생성된 Car 인스턴스를 carA 변수에 초기화해 carA가 Car 인스턴스의 주소값을 통해 접근할 수 있게된다.
메소드를 정의하는 방법
메소드(method)는 어떠한 작업을 수행하기 위한 명령문의 집합이다.
접근제어자 반환타입 메소드명(매개변수) // 선언부
{
... // 구현부
}
- 선언부
- 접근제어자 : 해당 메소드에 접근할 수 있는 범위를 명시한다.
- 반환타입 : 메소드에서 작업이 완료된 이후 반환하는 값의 자료형을 명시한다.
- 메소드명 : 메소드를 호출하기위한 이름을 명시한다.
- 매개변수 : 메소드 호출 시 전달받을 변수들을 명시한다.
- 구현부
기본적으로 하나의 클래스에는 동일한 이름을 가진 메소드를 선언할 수 없지만, 오버라이딩을 통해 가능하다.
오버라이딩은 메서드 매개변수의 개수나 타입을 다르게해 같은 이름을 가진 메서드를 작성하는 것이다.
public class Car
{
// 필드
private String modelName;
private String color;
private int maxSpeed;
private String ownerName;
// 생성자 (without parameters)
public Car()
{
}
// 생성자 (with parameters)
public Car(String modelName, String color, int maxSpeed, String ownerName)
{
this.modelName = modelName;
this.color = color;
this.maxSpeed = maxSpeed;
this.ownerName = ownerName;
}
// 메소드
public void accelerate (int speed)
{
int current = 0;
int maximum = (speed > this.maxSpeed)? this.maxSpeed : speed;
while (current <= maximum)
{
System.out.printf("부릉부릉~~ %d km/h", current);
current++;
}
}
// 메소드 오버라이딩
public void accelerate ()
{
int current = 0;
while (current <= this.maxSpeed)
{
System.out.printf("부릉부릉~~ %d km/h", current);
current++;
}
}
}
생성자를 정의하는 방법
생성자는 이름이 없고 클래스명을 사용한다. 메서드와 마찬가지로 오버라이딩을 제공한다.
접근제어자 클래스명(매개변수)
{
// 객체 초기화 코드
}
this 키워드 이해하기
this 키워드는 객체 자신을 의미하며, 인스턴스 주소값이 저장되어있다. 모든 인스턴스의 메소드 내부에 지역변수로 존재하며, 보통 생성자나 메서드의 매개변수명이 필드명과 동일한 경우 명확하게 구분짓기 위해 사용한다.
public Car(String modelName, String color, int maxSpeed, String ownerName)
{
this.modelName = modelName;
this.color = color;
this.maxSpeed = maxSpeed;
this.ownerName = ownerName;
}
과제
참고 자료
'☕️ JAVA > WhiteShip Java LIVE Study' 카테고리의 다른 글
[WhiteShip Java LIVE Study] 6주차 : 상속 (0) | 2021.02.17 |
---|---|
[WhiteShip Java LIVE Study] 4주차 : 제어문 (0) | 2020.12.11 |
[WhiteShip Java LIVE Study] 3주차 : 연산자 (0) | 2020.11.30 |
[WhiteShip Java LIVE Study] 2주차 : 자바 데이터 타입, 변수 그리고 배열 (0) | 2020.11.20 |
[WhiteShip Java LIVE Study] 1주차 : JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가 (0) | 2020.11.15 |