이름, 신장, 체중을 멤버로 가지는 사람 클래스(Class)를 작성
- class file은 class 단위로 만들어지기 때문에 이번 코드에서 Human.class와 HumanTest.class가 생성된다.
- .java file은 메인 메서드의 이름을 따라 HumanTester.java가 생성된다.
- class는 설계도이다. 설계도에 기반해 만든 개별 실체를 instance라 한다.
- name, height, weight는 데이터를 포함하는 field
- 클래스 구성원의 동작을 의미하는 method
- gildong, chulsu 개별 구성원을 의미하는 instance
class Human{
//Human 클래스의 name, height, weight 필드(field)
String name;
int height;
int weight;
void eat(String food) { //Human 클래스의 eat 메서드(method)
System.out.println(name+"은 "+ food+"을(를) 먹습니다.");
} // food
} //Human
public class HumanTest {
public static void main(String[] args) {
Human gildong = new Human();
Human chulsu = new Human();
gildong.name = "홍길동";
gildong.height = 170;
gildong.weight = 70;
chulsu.name = "철수";
chulsu.height = 180;
chulsu.weight = 75;
System.out.println("이름: "+ gildong.name);
System.out.println("키: "+ gildong.height+ "cm");
System.out.println("몸무게: "+ gildong.weight+ "kg");
System.out.println("이름: "+ chulsu.name);
System.out.println("키: "+ chulsu.height+ "cm");
System.out.println("몸무게: "+ chulsu.weight+ "kg");
gildong.eat("치킨");
chulsu.eat("된장찌개");
} //main
} //HumanTest
결과
이름: 홍길동
키: 170cm
몸무게: 70kg
이름: 철수
키: 180cm
몸무게: 75kg
홍길동은 치킨을(를) 먹습니다.
철수은 된장찌개을(를) 먹습니다.
현재 Class의 문제점
- 초기화와 관련된 위험성 - 인스턴스의 각 필드 값을 초기화를 강제할 수 있어야 한다.
- 데이터 보호와 관련된 위험성 - gildong.name는 다른 클래스에서 자유롭게 변경할 수 있다.
위의 문제점이 해결되도록 Human 클래스를 수정
- 필드가 private를 이용해 선언됨으로써 외부 접근이 차단된다.
- 직접 field에 접근하지 않는 대신, getName, getWeight, getHeight 메서드를 이용해 필드값을 return 받는다.
- 생성자를 지정하지 않으면 인스턴스 생성시 기본 생성자가 자동으로 생성된다.
- 생성자를 지정했다면, 인스턴스 생성시 생성자가 요구하는 파라미터에 값을 입력해야 한다.
class Human{ //Human 클래스의 name, height, weight 필드(field)
private String name;
private int height;
private int weight;
//-- 생성자 --//
Human (String n, int h, int weight){
this.name = n; this.height = h; this.weight = weight;
// this.weight를 사용하게 되면 class의 멤버변수의 field를 지목하게 되며,
// weight는 Human 생성자 파라미터parameter로부터 받은 아규먼argument 값이 된다.
} //생성
String getName() {return name;} // 이름 가져오
int getHeight() {return height;}
int getWeight() {return weight;}
void eat(String food) { //Human 클래스의 eat 메서드(method)
System.out.println(name+"은 "+ food+"을(를) 먹습니다.");
} //food
} //Human
public class HumanTest {
public static void main(String[] args) {
Human gildong = new Human("홍길동", 170, 70);
Human chulsu = new Human("철수", 180, 75);
System.out.println("이름: "+ gildong.getName());
System.out.println("키: "+ gildong.getHeight()+ "cm");
System.out.println("몸무게: "+ gildong.getWeight()+ "kg");
System.out.println("이름: "+ chulsu.getName());
System.out.println("키: "+ chulsu.getHeight()+ "cm");
System.out.println("몸무게: "+ chulsu.getWeight()+ "kg");
gildong.eat("치킨");
chulsu.eat("된장찌개");
} //main
결과
이름: 홍길동
키: 170cm
몸무게: 70kg
이름: 철수
키: 180cm
몸무게: 75kg
홍길동은 치킨을(를) 먹습니다.
철수은 된장찌개을(를) 먹습니다.
자동차 클래스 만들기
Field
- String: 이름, 번호
- int: 폭, 높이, 길이
- double: 현재 위치(x좌표, y좌표), 연료탱크용량, 남은 연료, 연비
Method
- (X,Y) 좌표 불러오기
- 남은 연료 불러오기
- 사양 표시하기
- 지시한 (X, Y)만큼 자동차 이동하기
- 급유하기
생성시 (X, Y) (0, 0)이며, 그 이외의 필드에는 값을 설정할 것
Car 클래스
class Car{
private String name;
private String number;
private int width; //폭
private int height; //높이
private int length; //길이
private double x; // x좌표
private double y; //y좌표
private double tankage; //탱크 용량
private double fuel; //남은 연료
private double mileage; //연비
Car(String name, String number, int width, int length, int height, double tankage, double fuel, double mileage){
this.name = name;
this.number = number;
this.width = width;
this.height = height;
this.length = length;
this.x = 0; this.y = 0;
this.tankage = tankage;
this.fuel = fuel;
this.mileage = mileage;
} // Car 생성자
double getX() {return this.x;}
double getY() { return this.y;}
double getFuel() {return this.fuel;}
void getSpec() {
System.out.println("자동차명: "+ this.name);
System.out.println("자동차번호: "+ this.number);
System.out.println("자동차넓이: "+ this.width);
System.out.println("자동차높이: "+ this.height);
System.out.println("자동차길이: "+ this.length);
System.out.println("자동차배기량: "+ this.tankage);
System.out.println("자동차연비: "+ this.mileage);
} //getSpec
void moveCar(double x, double y) {
this.x += x; this.y += y;
double distance = Math.sqrt(x*x + y*y);
double usedFuel = distance/this.mileage;
this.fuel -= usedFuel;
System.out.printf("자동차를 %f만큼 이동합니다. 이동하는 데 드는 연료는 %f입니다.\n남은 연료는 %f입니다.",
distance, usedFuel, fuel);
} //moveCar
void refuel(double amountOfFuel) {
double cap = this.tankage - this.fuel;
if (cap<amountOfFuel) amountOfFuel = cap;
// 남은 용량보다 많이 주입하면, 연료는 연료탱크가 가득 찰 때 까지만 주입된다.
this.fuel += amountOfFuel;
System.out.printf("연료를 %f만큼 주입합니다. 현재 남은 연료량은 %f입니다.", amountOfFuel, this.fuel);
} //refuel
} //Car 본체
메인함수를 포함한 CarClass. 메인함수에서 sonata 객체를 생성
public class CarClass {
public static void main(String[] args) {
Car sonata = new Car("sonata", "7777", 1860, 2840, 1445, 1999, 1900, 19.0);
sonata.getSpec();
sonata.moveCar(1000, 1500);
System.out.println("현재 위치: ("+ sonata.getX()+", "+ sonata.getY()+")");
System.out.println("남은 연료: "+ sonata.getFuel());
sonata.refuel(100);
} //main
} //CarClass
실행결과
자동차명: sonata
자동차번호: 7777
자동차넓이: 1860
자동차높이: 1445
자동차길이: 2840
자동차배기량: 1999.0
자동차연비: 19.0
자동차를 1802.775638만큼 이동합니다. 이동하는 데 드는 연료는 94.882928입니다.
남은 연료는 1805.117072입니다.현재 위치: (1000.0, 1500.0)
남은 연료: 1805.117071698316
연료를 100.000000만큼 주입합니다. 현재 남은 연료량은 1905.117072입니다.
'Java > Java 기초' 카테고리의 다른 글
Java14 클래스 접근자와 인스턴스 배열 (0) | 2020.05.15 |
---|---|
Java13 클래스 생성자 다중 생성 (0) | 2020.05.14 |
Java11 메서드(Method)와 오버로딩(overloading) (0) | 2020.05.12 |
Java10 참조형 객체, 2차원 배열 (0) | 2020.05.11 |
Java9 문자열 배열 (0) | 2020.05.08 |