위와 같이 선언된 클래스를 가지고 Car 객체의 인스턴스를 생성할 수 있습니다.
객체를 참조하기 위한 참조 변수를 먼저 선언합니다.
선언
클래스이름 객체참조변수이름;
예제
Car myCar;
그 후에 new 키워드를 사용하여 인스턴스를 생성하고, 해당 인스턴스의 주소를 미리 선언한 참조 변수에 저장하여 사용합니다.
선언
객체참조변수이름 = new 클래스이름();
예제
myCar = new Car();
레퍼런스 변수 선언과 객체 생성은 동시에 할 수 있습니다.
선언
클래스이름 객체참조변수이름 = new 클래스이름();
예제
Car myCar = new Car();
메소드란 어떠한 특정 작업을 수행하기 위한 명령문의 집합이라 할 수 있습니다.
클래스에서 메소드를 작성하여 사용하는 이유는 중복되는 코드의 반복적인 프로그래밍을 피할 수 있기 때문입니다.
또한, 모듈화로 인해 코드의 가독성도 좋아집니다.
그리고 프로그램에 문제가 발생하거나 기능의 변경이 필요할 때도 손쉽게 유지보수를 할 수 있습니다.
메소드를 작성할 때는 되도록 하나의 메소드가 하나의 기능만을 수행하도록 작성하는 것이 좋습니다.
클래스에서 메소드를 정의하는 방법은 일반 함수를 정의하는 방법과 크게 다르지 않습니다.
접근제어자 반환타입 메소드이름(매개변수) { //선언부
//구현부
}
class Car {
private int currentSpeed;
private int accelerationTime;
...
public void accelerate(int speed, int second) { // 선언부
// 구현부
System.out.println(second + "초간 속도를 시속 " + speed + "(으)로 가속함!!");
}
...
}
정의한 메소드는 멤버 참조 연산자(.)를 사용하여 호출할 수 있습니다.
문법
1. 객체참조변수이름.메소드이름(); 👆 매개변수가 없는 메소드의 호출 2. 객체참조변수이름.메소드이름(인수1, 인수2, ...); 👆 매개변수가 있는 메소드의 호출
다음 예제는 앞서 정의한 accelerate() 메소드를 호출하는 예제입니다.
예제
Car myCar = new Car(); 👆 객체를 생성함 myCar.accelerate(60, 3); 👆 myCar 인스턴스의 accelerate() 메소드를 호출함
다음 예제는 실제로 accelerate() 메소드를 정의하고 호출하는 예제입니다.
예제
class Car { private int currentSpeed; private int accelerationTime; public void accelerate(int speed, int second) { System.out.println(second + "초간 속도를 시속 " + speed + "(으)로 가속함!!"); } } public class Method01 { public static void main(String[] args) { Car myCar = new Car(); myCar.accelerate(60, 3); // 메소드 호출 } }
실행 결과
3초간 속도를 시속 60(으)로 가속함!!
객체를 만드는 특별한 메소드
우리는 이미 생성자를 사용했습니다. 아래 코드에서 생성자를 찾아봅시다.
Car car0 = new Car();
Car car1 = new Car();
Car car2 = new Car();
정답은 new Car()
입니다.
생성자는 두가지 역할을 합니다.
👇 1. 객체 생성
Car myCar = new Car();
👇 2. 필드 초기화
myCar.name = "카니발";
myCar.money = 3180;
myCar.color = "white";
👇 객체 생성과 동시에 초기화
Car myCar = new Car("카니발", 3180, "white");
public static void main(String[] args) {
Car myCar = new Car("카니발", 3180, "white");
}
static class Car {
String name;
int money;
String color;
Car(String n, int m, String c) {
name = n;
money = m;
color = c;
}
}
Car myCar = new Car("카니발", 3180, "white");
일반 메소드와 차이는 리턴 타입이 없다는 것입니다.
static class Car {
String name;
int money;
String color;
Car(String n, int m, String c) {
name = n;
money = m;
color = c;
}
}
전역변수(인스턴스 필드)와 지역변수(매개변수) 구분
class Student {
String name;
int age;
Student(String name, int age) {
this.name = name; 👈 this.name는 인스턴스 필드 / name는 매개변수를 의미
this.age = age; 👈 this.age 인스턴스 필드 / age는 매개변수를 의미
class Student {
String name; 👈 인스턴스 필드(전역변수)
int age;
Student() {
this("철수", 4); 👈 Student(String name, int age) 생성자를 호출
}
Student(String name) {
this(name, 4); 👈 Student(String name, int age) 생성자를 호출
}
Student(String name, int age) {
this.name = name;
this.age = age;
}
}
소스가 복잡해지고 방대해지면 변수를 관리하기 힘들고, 필드와 매개변수를 동일하게 정의하여 this로 구분하는 것이 직관적이고 편리합니다.
https://danmilife.tistory.com/19
http://www.tcpschool.com/java/java_class_declaration
http://www.tcpschool.com/java/java_methodConstructor_method
https://cloudstudying.kr/lectures/197
https://leeph.tistory.com/29