실생활로 예를 들어 비유해 보면, 붕어빵 틀이 클래스이고, 붕어빵 틀을 통해 만들어지는 여러 붕어빵들이 객체가 된다.
public class 클래스명 {
// 객체 변수
// 메소드
// + 접근제어자
// + static
}
클래스명 객체명 = new 클래스명(); // 객체 생성
public class 클래스명 {
클래스명() {}
}
// Java 프로그래밍 - 클래스와 객체_1
// Car 클래스 - 객체변수, 메소드
class Car {
String name;
String type;
// Car() {} 생성자가 디폴트 값으로 존재한다. 생략 가능!
public void printCarInfo() {
System.out.println("== Car Info == ");
System.out.println("name = " + name);
System.out.println("type = " + type);
} // 메소드1
public void move() {
System.out.println("이동!");
} // 메소드2
public void brake() {
System.out.println("정지!");
} // 메소드3
}
class Car2 {
String name;
String type;
// Car() {} 생성자가 디폴트 값으로 존재한다.
Car2(String name, String type) { // 받아온 이름을 변수에 대입, 데이터를 바로 입력 받게 설정
this.name = name; // 이름이 같으므로 this를 이용해 자기 클래스의 객체를 가리킨다.
this.type = type;
System.out.println("생성자 출력!");
}
public void printCarInfo() {
System.out.println("== Car Info == ");
System.out.println("name = " + name);
System.out.println("type = " + type);
}
public void load() {
System.out.println("짐을 주세요!");
}
public void horn() {
System.out.println("빵빵!");
}
}
public class Main {
public static void main(String[] args) {
// Car 클래스 사용
Car myCar1 = new Car(); // 클래스를 하나 만들어 객체로 생성해준다.
myCar1.name = "a";
myCar1.type = "suv";
myCar1.printCarInfo(); // 메소드1 출력
myCar1.move(); // 메소드2 출력
myCar1.brake(); // 메소드3 출력
// Car2 클래스 사용
Car2 myCar2 = new Car2("b", "sedan");
myCar2.printCarInfo();
myCar2.load();
myCar2.horn();
}
}
// Practice
// 다음 클래스 직접 만든 후 객체 생성
// 클래스명: Animal
// 특성: 이름, 무게, 분류
// 기능: 먹기, 잠자기, 걷기, 뛰기
class Animal {
String name;
double weight;
String classification;
Animal(String name, double weight, String classification) {
this.name = name;
this.weight = weight;
this.classification = classification;
}
public void printInfo() {
System.out.println("== Animal Info ==");
System.out.println("name = " + name);
System.out.println("weight = " + weight);
System.out.println("classification = " + classification);
}
public void Eat() {
System.out.println("밥을 먹습니다!");
}
public void Sleep() {
System.out.println("잠을 잡니다.");
}
public void Walk() {
System.out.println("걷습니다!");
}
public void Run() {
System.out.println("뜁니다!");
}
}
public class Practice {
public static void main(String[] args) {
// Test code
Animal animal1 = new Animal("강아지", 5.0, "포유류");
Animal animal2 = new Animal("구피", 0.01, "어류");
//
animal1.printInfo();
animal2.printInfo();
}
}
public class 클래스명 {
클래스명() {} // 디폴트 생성자
클래스명(String name, String type) {
// 데이터를 넣어서 초기화 하고 싶을 때의 생성자
구현 내용;
}
}
// Java 프로그래밍 - 클래스와 객체_2
import car.Car2;
class Car {
String name;
String type;
Car(String name, String type) {
this.name = name;
this.type = type;
}
public void printCarInfo() {
System.out.println("=== Car Info ===");
System.out.println("name: " + name);
System.out.println("type: " + type);
}
// 오버로딩 구현
public void printCarInfo(String date) {
this.printCarInfo();
System.out.println("date : " + date);
} // 날짜 출력 메소드
public void printCarInfo(int number) {
this.printCarInfo();
System.out.println("number : " + number);
} // 차 번호 출력 메소드
public void printCarInfo(String date, int number) {
this.printCarInfo();
System.out.println("date: " + date);
System.out.println("number : " + number);
} // 날짜와 차 번호 출력 메소드
// 같은 이름의 메소드는 4개 만들어졌지만, 입력 파라미터의 개수와 타입이 다르므로 서로 다른 메소드로 인식
}
class Car3 { // static을 이용하기 위해 만든 클래스
// static 변수
static String name = "None"; // static 메소드에서 사용할 수 있는 변수도 static 이어야 한다.
String type;
Car3(String name, String type) {
this.name = name;
this.type = type;
}
public void printCarInfo() {
System.out.println("=== Car Info ===");
System.out.println("name: " + name);
System.out.println("type: " + type);
}
// 스태틱 메소드
public static void getName() {
System.out.println("Car name: " + name);
}
}
public class Main {
public static void main(String[] args) {
Car myCar1 = new Car("a", "sedan");
myCar1.printCarInfo();
// 1. 오버로딩 사용
System.out.println("=== 오버로딩 사용 ===");
myCar1.printCarInfo("2022");
myCar1.printCarInfo(1234);
myCar1.printCarInfo("2022", 1234);
// 2. 접근 제어자
System.out.println("=== 접근 제어자 ===");
Car2 myCar2 = new Car2("a", "b", "c", "d");
System.out.println(myCar2.name1);
// System.out.println(myCar2.name2); -> private 접근 안됨.
// System.out.println(myCar2.name3); -> protected 접근 안됨.
// System.out.println(myCar2.name4); -> default 접근 안됨.
// 3. Static
System.out.println("=== Static ===");
Car3.getName();
// 메소드를 위의 'Car2 myCar2 = new Car2("a", "b", "c", "d");'과 같은 형태로 만들지 않았는데
// 바로 클래스 명을 통해 해당 메소드를 호출할 수 있다.
Car3 myCar3_1 = new Car3("a", "sedan");
Car3 myCar3_2 = new Car3("b", "suv");
Car3 myCar3_3 = new Car3("c", "rv");
myCar3_1.printCarInfo();
myCar3_2.printCarInfo();
myCar3_3.printCarInfo();
// 변수가 static으로 잡혀있으면 객체끼리 그 변수를 공유한다. 따라서 제일 마지막에 바꿔준 변수로 모두 공유가 되어
// 위의 코드에서 name은 모두 'c'로 출력된다.
}
}
따로 패키지를 만들어 Car2 구현
package car;
public class Car2 {
public String name1;
private String name2;
protected String name3;
String name4; // 디폴트를 의미
public Car2(String name1, String name2, String name3, String name4) {
this.name1 = name1;
this.name2 = name2;
this.name3 = name3;
this.name4 = name4;
}
}
// Practice
// 계산기 덧셈의 여러 타입 오버로딩
class Calculator {
public int sum(int a, int b) {
return a + b;
}
public double sum(double a, double b) { return a + b; }
public double sum(String a, String b) { return Double.parseDouble(a) + Double.parseDouble(b); }
// 스트링을 더블 타입으로 변환 후 더해줌.
public int sum(int a, int b, int c) { return a + b + c; }
}
public class Practice {
public static void main(String[] args) {
// Test code
Calculator c = new Calculator();
System.out.println(c.sum(1, 2));
System.out.println(c.sum(1.0, 2.0));
System.out.println(c.sum("1", "2"));
System.out.println(c.sum(1, 2, 3));
}
}