◇ 제어자
변수, 메서드의 선언부에 사용되어 부가적인 의미를 부여
- 접근 제어자 : public, protected, default, private
- 멤버 또는 클래스에 사용, 외부에서 접근하지 못하도록 제한
- 지정되지 않았다면 default
- 그 외 제어자 : static, final, abstract
- 사용 가능한 접근 제어자
- 클래스 : public, default
- 메서드 & 멤버 변수 : public, protected, default, private
- 지역변수 : 사용불가능
- Getter와 Setter
- Getter : 외부에서 객체의 private한 필드를 읽을 필요가 있을 때 사용
※ 메서드 이름의 규칙은 get + 필드 이름(첫 글자 대문자)
private double speed; // 자동차 속도 , km/h private char gear = 'P'; // 기어의 상태, P,R,N,D private boolean lights; // 자동차 조명의 상태 public String getModel() { return model; } public String getColor() { return color; } public double getPrice() { return price; }
- Setter : 외부에서 객체의 private 한 필드를 저장/수정 할 필요가 있을 때 사용
※ 메서드 이름의 규칙은 set + 필드 이름(첫 글자 대문자)
private double speed; // 자동차 속도 , km/h private char gear = 'P'; // 기어의 상태, P,R,N,D private boolean lights; // 자동차 조명의 상태 public void setModel(String model) { this.model = model; } public void setColor(String color) { this.color = color; } public void setPrice(double price) { this.price = price; }
- Getter : 외부에서 객체의 private한 필드를 읽을 필요가 있을 때 사용
- 사용가능한 제어자
- 클래스 : public, default, final, abstract
- 메서드 : public, protected, default, private, final, abstract, static
- 멤버 변수 : public, protected, default, private, final, static
- 지역 변수 : final
- 제어자 사용 시 주의 사항
- 메서드에 static과 abstract를 함께 사용할 수 없다.
- 클래스에 abstract와 final을 동시에 사용할 수 없다.
- abstract메서드의 접근 제어자가 private 일 수 없다.
- 메서드에 private와 final을 같이 사용할 필요는 없다.
◇ package와 import
- package : 클래스의 일부분이면서 클래스를 식별해 주는 용도
- 상위, 하위 패키지의 구분은 도트(.)로 구분
- import : 다른 패키지에 있는 클래스를 사용하기 위해 명시하는 키워드
package week3.packageExample.main;
import week3.packageExample.pk1.Car;
public class Main {
public static void main(String[] args) {
// import로 접근
Car car1 = new Car();
// 전체 경로로 접근
week3.packageExample.pk1.Car car2 = new week3.packageExample.pk1.Car();
car1.horn();
car2.horn();
}
}
◇ 상속
- 객체 지향 프로그램에서는 부모 클래스의 필드와 메서드를 자식 클래스에게 물려줄 수 있다.
- 상소을 사용하면 적은 양의 코드로 새로운 클래스를 작성할 수 있다.
- 공통적인 코드를 관리하여 코드의 추가와 변경이 쉬워질 수 있다.
- 코드의 중복이 제거되고 재사용성이 증가하여 생산성과 유지 보수성이 증가한다.
- 상속관계 : is - a("~은 ~(이)다)
ex) 고래는 포유류다. - 포함관계 : has -a ("~은 ~을(를) 가지고 있다")
ex) 자동차는 바퀴를 가지고있다. - 단일 상속과 다중 상속 : Java는 클래스 간의 관계가 복잡해지는 문제를 방지하기위해 다중상속을 허용하지 않는다.
- final 클래스 : 클래스에 final 키워드를 선언하면 더 이상 상속할 수 없는 클래스가 된다.
- final 메서드 : 메서드에 final 키워드를 선언하면 최종적인 메서드가 됨으로 더 이상 오버라이딩 할 수없는 메서가된다.
- Object : Java 내 모든 클래스들의 최상위 부모 클래스
◇ Overriding(오버라이딩)
자식이 부모로부터 상속받은 메서드의 내용을 재정의 하는 것
1. Main class
public class Main {
public static void main(String[] args) {
// 자식 클래스 스포츠카 객체 생성
SportsCar sportsCar = new SportsCar("Orion");
// 오버라이딩한 brakePedal(), horn() 메서드 호출
sportsCar.brakePedal();
sportsCar.horn();
}
}
2. Car class(부모 클래스)
public class Car {
double speed; // 자동차 속도 , km/h
public double brakePedal() {
speed = 0;
return speed;
public void horn() {
System.out.println("빵빵");
}
}
3. SportsCar class(자식 클래스)
public class SportsCar extends Car{
String engine;
public void booster() {
System.out.println("엔진 " + engine + " 부앙~\n");
}
public SportsCar(String engine) {
this.engine = engine;
}
@Override
public double brakePedal() {
speed = 100;
System.out.println("스포츠카에 브레이크란 없다");
return speed;
}
@Override
public void horn() {
booster();
}
}
※ 여기서 @는 어노테이션(Annotation)이라고 한다.
- 자바 소스 코드에 추가하여 사용할 수 있는 메타데이터의 일종
- 보통 @ 기호를 앞에 붙여서 사용
- JDK 1.5 버전 이상에서 사용 가능
- 자바 애너테이션은 클래스 파일에 임베디드되어 컴파일러에 의해 생성된 후 자바 가상머신에 포함되어 작동한다.
- 코드의 흐름
- Mian 클래스에 스포츠카 객체 생성(Sports Car class는 Car class를 상속함)
- brakePedal() 메서드 호출(SportsCar class로 진입해보면)
- brakePedal() 메서드는 부모 클래스인 Car에서 상속받아 오버라이딩하여 재정의
- horn() 메서드 호출 (SportsCar class로 진입해보면)
- horn() 메서드는 부모 클래스인 Car에서 상속받아 오버라이딩하여 재정의
- booster() 메서드를 호출
◇ super
this가 객체 자신을 가르킨다면 super은 부모 클래스를 가르키는 것이다.
1. 메인 클래스
public class Main {
public static void main(String[] args) {
// 자식 클래스 스포츠카 객체 생성
SportsCar sportsCar = new SportsCar("Orion");
// 자식 객체의 model, color, price 초기값 확인
System.out.println("sportsCar.model = " + sportsCar.model); // Ferrari
System.out.println("sportsCar.color = " + sportsCar.color); // Red
System.out.println("sportsCar.price = " + sportsCar.price); // 3.0E8
System.out.println();
// setCarInfo 메서드 호출해서 부모 및 자식 필드 값 저장
sportsCar.setCarInfo("GV80", "Black", 50000000);
}
}
2. 부모 클래스
public class Car {
String model; // 자동차 모델
String color; // 자동차 색상
double price; // 자동차 가격
}
3. 자식 클래스
public class SportsCar extends Car{
String engine;
String model = "Ferrari"; // 자동차 모델
String color = "Red"; // 자동차 색상
double price = 300000000; // 자동차 가격
public SportsCar(String engine) {
this.engine = engine;
}
public void setCarInfo(String model, String color, double price) {
super.model = model; // model은 부모 필드에 set
super.color = color; // color는 부모 필드에 set
this.price = price; // price는 자식 필드에 set
}
}
- 코드 설명
- 메인 클래스에서 sportsCar.setCarInfo()메서드를 호출
- 자식 클래스의 setCarInfo로 가서 명령 실행
- spuer.model, super.color은 자식의 필드값이 아닌 부모의 필드값 변경
- this.price는 자식의 필드값 변경
'Java & Spring > Java' 카테고리의 다른 글
13일차 - Java강의(예외, 제네릭) (0) | 2024.07.31 |
---|---|
11일차 - Java강의(계산기 실습, 클래스화, 추상화) (0) | 2024.07.29 |
9일차 - Java강의(클래스, 필드, 생성자, 멤버, this) (0) | 2024.07.25 |
8일차 - Java강의(객체지향 ☆) (0) | 2024.07.24 |
enhanced switch()문 (0) | 2024.07.24 |