자바의 Class에 대해 학습하세요.
학습할 것
- 클래스 정의하는 방법
- 객체 만드는 방법(new 키워드 이해하기)
- 메소드 정의하는 방법
- 생성자 정의하는 방법
- this 키워드 이해하기
객체를 정의해놓은 것으로 객체를 생성하는데 사용된다.
여기서 객체란 '실제 존재하는 것'으로 지금 이 포스팅을 작성하는 키보드부터 책상, 컴퓨터, 의자 등의 사물들이 객체라고 할 수 있다. 프로그래밍에서 객체는 클래스에 정의된 내용대로 메모리에 생성된 것을 의미한다.
객체와 클래스의 관계를 실행활에 비유를 하자면 제품 설계도와 제품의 관계로 볼 수 있다. TV 설계도는 TV를 정의한 것으로 TV를 보기위해서는 설계도가 아니라 TV가 필요한 것처럼 클래스도 객체를 만드는데만 사용된다. 그리고 객체는 클래스를 통해 생성한 다음에야 사용 가능하다.
이처럼 클래스를 선언해두면 그 이후 필요할 때마다 해당 클래스를 통해 객체를 생성해 사용할 수 있다. 클래스는 객체를 정의하기 위한 상태(멤버변수)와 메소드(함수)로 구성된다.
$
,_
외의 특수 문자는 사용할 수 없다.1. 소스파일 생성
: 적절한 위치에 원하는 클래스이름.java 로 소스 파일을 생성해준다.
(이 때 클래스 이름은 작성 규칙을 지켜주도록 한다.)
2. 클래스에는 객체에 필요한 구성들을 선언해준다
package me.catsbi.study.step5;
public class 클래스이름 {
private String 필드;
public 클래스이름() { } // 생성자
public void 메소드(){
...
}
}
예제:: 자동차 클래스 정의하기
package me.catsbi.study.step5;
public class Car {
private String manufacturer;
private String name;
private long price;
private int numberOfWheel;
public Car(String manufacturer, String name, long price, int numberOfWheel) {
this.manufacturer = manufacturer;
this.name = name;
this.price = price;
this.numberOfWheel = numberOfWheel;
}
public Car() { }
public void go(){
System.out.println("앞으로 전진합니다.");
}
public void stop(){
System.out.println("멈춥니다.");
}
}
Car car = new Car();
설계도(클래스)를 작성했다면 이제 설계도를 통해 객체를 생성할 수 있습니다.
Java의 new 키워드는 클래스의 인스턴스를 만드는데 사용됩니다. 즉, 새 객체에 대한 메모리를 할당하고 해당 메모리에 대한 참조를 반환하여 클래스를 인스턴스화 합니다.
new keyword 특징
접근제어자 리턴타입 메소드명(파라미터){
// 실행할코드
return 리턴타입;
}
메소드는 기본적으로 리턴타입과 메소드 명만 있어도 정의가 가능함
접근제어자
접근제어자 | 같은 클래스의 멤버 | 같은 패키지의 멤버 | 자식 클래스의 멤버 | 그외의 영역 |
---|---|---|---|---|
public | o | o | o | o |
protected | o | o | o | |
default | o | o | ||
private | o |
메소드를 정의할 때 중요한 기법이 있는데 바로 메소드 오버로딩과 메소드 오버라이딩이다.
자바의 객체지향의 특징인 다형성을 이용한 방법으로 코드의 변경과 확장을 용이하게 해주는 자바의 대표적인 특징이다.
메소드 오버로딩(Method Overloading)
메소드 오버로딩은 파라미터의 갯수나 타입이 다르다면 동일한 이름의 메소드명을 사용해 메소드를 정의할 수 있는 기법이다.
매개변수는 동일하고 리턴타입이 다른 경우에는 메소드 오버로딩이 성립하지 않는다.
예를 들면, System.out.println()이 대표적인 메소드 오버로딩 기법 중 하나이다.
//메소드 오버로딩
public String getName() {...}
public String getName(int age) {...}
//대표적인 메소드 오버로딩
System.out.println("바이에른 뮌헨");
System.out.println("1900);
메소드 오버라이딩(Method Overriding)
메소드 오버라이딩은 상위 클래스가 정의한 메소드를 하위 클래스가 가져와 변경하거나 확장하는 기법, 즉 하위 클래스에서 메소드를 재정의하는 기법이다.
class Person {
public void info() {
System.out.println("사람입니다");
}
}
class Adult extends Person {
@Override
public void info() {
System.out.println("어른입니다.");
}
}
class Child extends Person {
@Override
public void info() {
System.out.println("어린이입니다.");
}
}
Person person = new Person();
Adult adult = new Adult();
Child child = new Child();
person.info(); //사람입니다.
adult.info(); //어른입니다.
child.info(); //어린이입니다.
메소드 오버라이딩은 상위 클래스의 메소드를 하위 클래스에서 메소드를 재정의하기 때문에 확장과 변경에 용이하다는 장점이 있다.
변수를 선언하고 초기화하는 것과 마찬가지로 클래스를 생성하고 객체를 호출할 때 객체를 초기화 하기 위해 사용되는 것이 생성자이다.
생성자는 기본 생성자, 묵시적 생성자, 명시적 생성자로 구분된다.
기본 생성자 : 클래스 내부에 선언된 생성자가 없는 경우 객체 생성 시에 컴파일러가 자동으로 추가해주는 생성자이다.
묵시적 생성자 : 파라미터 값을 가지지 않는 생성자이다.
명시적 생성자 : 파라미터 값을 가지는 생성자이다.
class Person() {...} -> 기본 생성자 호출
class Person() {
//묵시적 생성자
public Person() {
System.out.println("생성되었습니다.");
}
//명시적 생성자
public Person(String name, int age){
this.name = name;
this.age = age;
}
}
생성자는 몇가지 특징을 가지고 있다.
생성자는 리턴 타입을 가지지 않는다.
생성자는 클래스 이름과 동일하다.
모든 클래스는 생성자가 반드시 존재하고, 한개 이상의 생성자를 가진다.
클래스 내부에 생성자를 선언하지 않으면 컴파일러가 기본 생성자를 선언해 사용한다.
명시적 생성자만 선언되있는 경우 파라미터가 없는 생성자를 사용하고 싶다면 묵시적 생성자를 선언해주어야한다. (생성자가 클래스 내부에 선언되어 있기 때문에 기본 생성자가 생성되지 않는다.)
this 키워드는 클래스가 인스턴스화 되었을때 자기 자신의 메모리 주소를 가지고 있다.
즉, 자기 자신을 나타내는 키워드라고 생각하면 된다. 또한, 클래스 내부의 필드 이름과 메소드를 통해 넘어온 파라미터의 변수명이 동일한 경우 this키워드를 이용해 클래스 내부의 필드이름과 파라미터를 구분해준다.
class Person {
private String name;
public Person(String name) {
this.name = name; // 클래스 필드 name = 파라미터 name
}
}
this()는 클래스 내부에서 생성자를 호출한다.
this()의 경우 호출하는 곳의 첫 번째 문장에서 호출되어야 한다. 생성자가 파라미터가 있는 경우 this()안에 생성자 파라미터 타입에 맞게 직접 입력하여 사용할 수 있다.
class Person {
private String name;
public Person(String name) {
this.name = name; // 클래스 필드 name = 파라미터 name
}
public Person(String name)
this(name+"입니다");
}
}