◇ 클래스(Class) 설계
- 만들려고 하는 설계도를 선언(클래스 선언)
- 객체가 가지고 있어야 할 속성(필드) 정의
- 객체가 생성하는 방식을 정의(생성자) : 처음 객체가 생성 될 때(instance화) 어떤 로직을 수행해야 하며,
어떤 값이 필수로 들어와야 하는지 정의 - 객체가 가지고 잇어야 할 행위(메서드)정의
◇ 필드
- 외부 접근
Car car = new Car(); → 객체 생성 car.color = "blue"; → 내부 필드 접근
- 내부 접근
double brakePedal() { speed = 0; return speed; }
- 필드의 사용
- 초기화
public classs Car { String model = "Gv80"; // 자동차 모델 String color = "White"; // 자동차 색 boolean lights = true; }
- 필드의 사용
package week3; public class Main { public static void main(String[] args) { Car car = new Car(); // 객체 생성 // 필드 사용 car.color = "blue"; car.speed = 100; car.lights = false; System.out.println("car model = " + car.model); // Gv80 → 초기화값 System.out.println("car color = " + car.color); // blue → 변경값 System.out.println("car.speed = " + car.speed); // 100 → 변경값 System.out.println("car.lights = " + car.lights); // false → 변경값 } }
◇ 메서드
객체의 행위를 뜻한다
리턴타입 메서드명(매개변수, ...) {
실행할 코드
}
double brakePedal(double par) {
...
}
※ 해당 매개변수에 값을 전달하기 위해서는 순서와 타입에 맞춰 값을 넣어줘야한다.
- 가변길이 매개변수
void carSpeeds(double ...speeds) { for (double v : speeds) { System.out.println("v = " + v); } } carSpeeds(110, 120, 150); → 메서드 사용
- 외부 접근 : 객체 생성 후 ' . ' 도트 연산자를 사용하면된다.
public class Main { public static void main(String[] args) { Car car = new Car(); car.brakePedal(); } }
- 내부 접근 :
public class Car { double gasPedal(double kmh, char type) { changeGear(type); → Car class 내부에 별도 선언된 메서드라 가정 speed = kmh; return speed; } }
- 메서드 오버로딩
함수가 하나의 기능만을 구현하는것이 아니라 하나의 메서드 이름을 여러 기능을 구현하도록 하는 Java의 기능
- 메서드의 이름은 같고, 매개변수의 개수, 타입, 순서가 달라야한다.
- '응답 값만' 다른것은 오버로딩 할 수 없다.
- 접근 제어자만 다른것도 오버로딩을 할 수 없다.
- 오버로딩은 매개변수의 차이로만 구현 할 수 있다.
- 오버로딩의 장점 :
- 메서드 이름 하나로 상황에 따른 동작을 개별로 정의
- 메서드 이름 절약
- 기본형 매개변수와 참조형 매개변수의 차이 : 매개변수의 타입이 기본형일 때는 값 자체가 복사되어 넘어가기 때문에
매개값으로 지정된 변수의 원본 값이 변경되지 않는다.
- 기본형 매개변수public class Main { public static void main(String[] args) { Car car = new Car(); // 객체 생성 char type = 'D'; car.brakePedal(type); // 메서드 실행 완료 후 전달할 매개값으로 지정된 type 값 확인 System.out.println("type = " + type); // 기존에 선언한 값 'D' 출력, 원본 값 변경되지 않음 // 메서드 실행 완료 후 반환된 car 인스턴스의 gear 타입 확인 System.out.println("gear = " + car.gear); // 객체 내부에서 type을 변경하여 수정했기 때문에 'P' 출력 } }
public class Car { double brakePedal(char type) { speed = 0; type = 'P'; // 정지 후 매개변수 type을 어떤 타입으로 전달 받았는지 상관없이 'P'로 고정시키기 changeGear(type); return speed; } }
- 참조형 매개변수public class Main { public static void main(String[] args) { Car car = new Car(); // 객체 생성 Tire tire = new Tire(); tire.company = "금호"; // 금호 타이어 객체 생성 // 차 객체의 타이어를 등록하는 메서드 호출한 후 반환값으로 차 객체의 타이어 객체 반환 Tire carInstanceTire = car.setTire(tire); // 메서드 실행 완료 후 전달할 매개값으로 지정된 참조형 변수 tire의 company 값 확인 System.out.println("tire.company = " + tire.company); // "KIA" 출력 // 전달할 매개값으로 지정된 tire 인스턴스의 주소값이 전달되었기 때문에 호출된 메서드에 의해 값이 변경됨. // 메서드 실행 완료 후 반환된 car 인스턴스의 tire 객체 값이 반환되어 저장된 참조형 변수 carInstanceTire의 company 값 확인 System.out.println("carInstanceTire.company = " + carInstanceTire.company); // "KIA" 출력 } }
public class Car { Tire setTire(Tire tireCompany) { tireCompany.company = "KIA"; // 금호 타이어를 전달 받았지만 강제로 KIA 타이어로 교체 tire = tireCompany; return tire; } }
◇ 멤버
- 인스턴스 멤버
- 객체를 생성해야 사용가능
- 클래스 멤버
- 'static' 사용
- 공용적인 데이터를 저장하는 필드를 보통 클래스 멤버로 선언
- 인스턴스 필드를 사용하지 않고 실행되는 메서드가 존재한다면 static 키워드를 사용하여 클래스 메서드로 선언하는게 좋다.
※ 클래스 멤버로 선언된 메서드는 인스턴스 멤버를 사용할 수 없다.
- 지역변수
- 메서드 내부에 선언한 변수
- 메서드가 실행될 때마다 독립적인 값을 저장하고 관리
- 지역 변수는 메서드 내부에서 정의될 때 생성되어 메서드가 종료될 때까지만 유지
- final 필드와 상수
- final은 '최종적'이란 의미
- final 필드는 초기값이 저장되면 해당값을 프로그램이 실행되는 도중에는 절대로 수정 불가
- final 필드는 반드시 초기값을 지정해야함
◇ 생성자
객체가 생성될 때 호출되며 객체를 초기화하는 역할
- 기본 생성자 : 선언할 때 괄호()안에 아무것도 넣지 않는 생성자
※ 모든 클래스는 반드시 생성자가 하나 이상 존해야함(없으면 컴파일러가 자동으로 생성) - 생성자 오버로딩
※ modelName과 colorName의 위치가 달라 가능할 것 같지만 타입 순서가 같아서 불가능(String, String, double)
- 아래 코드에서 Car라는 class는 3가지 형태로 오버로딩 돼 3가지 객체가 생성가능하다.public Car(String modelName, String colorName, double priceValue) public Car(String colorName, String modelName, double priceValue)
public class Car { public Car(String modelName) { model = modelName; } public Car(String modelName, String colorName) { model = modelName; color = colorName; } public Car(String modelName, String colorName, double priceValue) { model = modelName; color = colorName; price = priceValue; } }
◇ this와 this()
- this는 객체 즉, 인스턴스 자신을 표현하는 키워드이다.
public Car(String model, String color, double price) { this.model = model; this.color = color; this.price = price; }
- this()는 생성자를 표현한 것이다.
다음 코드의 Car class로 들어가보면// 모델을 변경하면서 만들 수 있고 색상 : Blue, 가격 50000000 고정 Car car1 = new Car("GV60"); // 모델, 색상을 변경하면서 만들 수 있고 가격 100000000 고정 Car car2 = new Car("GV70", "Red"); // GV80 모델, 색상 Black, 가격 120000000 으로 완전하게 고정된 경우 Car car3 = new Car("GV80", "Black", 120000000);
위와 같다.public class Car { static final String COMPANY = "GENESIS"; // 자동차 회사 : GENESIS String model; // 자동차 모델 String color; // 자동차 색상 double price; // 자동차 가격 public Car(String model) { this(model, "Blue", 50000000); } public Car(String model, String color) { this(model, color, 100000000); } public Car(String model, String color, double price) { this.model = model; this.color = color; this.price = price; } }
- car1객체를 생성하면서 매개변수를 String model만 입력하는 경우
해당 명령어가 실행되고 this(model, "Blue", 50000000);는 Car(String model, String color, double price) 이므로public Car(String model) { this(model, "Blue", 50000000); }
최종적으로 해당 코드가 실행되게 된다.public Car(String model, String color, double price) { this.model = model; this.color = color; this.price = price; }
- this()는 생성자를 표현한 것이다.
'Java & Spring > Java' 카테고리의 다른 글
11일차 - Java강의(계산기 실습, 클래스화, 추상화) (0) | 2024.07.29 |
---|---|
10일차 - Java강의(제어자, package, import, 상속, this, super) (0) | 2024.07.26 |
8일차 - Java강의(객체지향 ☆) (0) | 2024.07.24 |
enhanced switch()문 (0) | 2024.07.24 |
7일차 - Java강의(연산자, 조건문, 반복문, 배열, 컬렉션) (0) | 2024.07.23 |