X좌표와 Y좌표로 이루어진 2차원 좌표 Coordinate 클래스를 작성하자.
class Coordinate{
private double x;
private double y;
// -- 생성자 -- //
Coordinate (double x, double y){this.x = x; this.y = y;}
// - 메서드 -- //
double getX() {return this.x;}
double getY() {return this.y;}
void setX(double x) { this.x = x;}
void setY(double y) { this.y = y;}
void setXY(double x, double y) { this.x = x; this.y = y;}
} //Coordinate
접근자(accessor)
- 클래스의 메서드 중 get으로 시작하는 메서드는 보통 필드값을 반환한다. 이런 메서드를 게터getter라고 한다.
- 반면 set으로 시작하는 메서드는 필드값을 설정한다. 이런 메서드를 세터setter라고 한다.
CoordinateTester1
- Coordinate 인스턴스 p를 생성한다. 이 때 참조형 변수 p는 인스턴스p의 주소값을 갖는다.
- Coordinate형 변수 q를 선언한 뒤 p를 대입하면, 참조형 변수 p의 값, 즉 인스턴스 p의 주소가 q에 대입된다.
- 따라서 참조형 변수 q를 이용한 메서드 활용과 필드값의 변경은 인스턴스p를 이용하게 된다.
package packageName;
import java.util.Scanner;
public class CoordinateTestser1 {
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
System.out.println("좌표 p를 입력하세요");
System.out.print("x: "); double x = stdIn.nextDouble();
System.out.print("y: "); double y = stdIn.nextDouble();
Coordinate p = new Coordinate(x, y);
System.out.println("p =("+ p.getX()+", "+ p.getY()+")");
Coordinate q = p;
q.setXY(9.9, 9.9);
System.out.println("p =("+ p.getX()+", "+ p.getY()+")");
System.out.println("q =("+ q.getX()+", "+ q.getY()+")");
System.out.println(p);
} //main
} // CoordinateTester1
결과
좌표 p를 입력하세요
x: 5.1
y: 5.2
p =(5.1, 5.2)
p =(9.9, 9.9)
q =(9.9, 9.9)
packageName.Coordinate@23223dd8
- packageName은 클래스 Coordinate가 속한 패키지의 이름이다.
인스턴스 배열
- Coordinate형 배열을 만들어서 한꺼번에 여러 객체의 좌표를 설정할 수 있을까?
import java.util.Scanner;
public class CoordinateTester2 {
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
System.out.print("좌표는 몇 개?:");
int n = stdIn.nextInt();
Coordinate[] a = new Coordinate[n]; // 요소 수 n개인 Coordinate형 배열
for (int i=0; i<a.length; i++)
a[i].setXY(5.5, 7.7);
} //main
} //CoordinateTester2
- 위의 CoordinateTester2 클래스를 실행하면 에러 메세지가 나온다.
- 그 이유는 Coordinate 배열 형식의 변수
a
는 Coordinate의 객체가 아니라 배열을 참조하는 변수이기 때문이다. 즉 a는 배열이지 Coordinate가 아니다.
- Coordinate 객체는 배열의 각각의 요소마다 새로 생성해주어야 한다.
- 그러한 코드는 다음과 같다.
import java.util.Scanner;
public class CoordinateTester2 {
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
System.out.print("좌표는 몇 개?:");
int n = stdIn.nextInt();
Coordinate[] a = new Coordinate[n]; // 요소 수 n개인 Coordinate형 배열
for (int i=0; i<a.length; i++)
a[i] = new Coordinate(5.5, 7.7);
for (int i=0; i<a.length; i++)
System.out.printf("객체 a[%d]=(%f, %f)\n", i, a[i].getX(), a[i].getY());
} // main
} // CoordinateTester2
결과
좌표는 몇 개?:2
객체 a[0]=(5.500000, 7.700000)
객체 a[1]=(5.500000, 7.700000)