void appendModelName(String modelName) {
// modelName += modelName; // modelName은 이름이 같다! 최신형 += 최신형임
this.modelName += modelName; // this : 인스턴스 객체, this.modelName = 인스턴스 변수 modelName(맨위의 것)
}
b1.insertMemoryCard(256);
1. 객체지향(OOP)
- 유지보수 용이함
- 높은 재사용성
2. 객체는 왜 사용할까
우리가 차량용 블랙박스를 제작한다고 생각해보자
// 우리가 만든 첫번째 제품
String modelName = "까망이";
String resolution = "FHD";
int price = 200000;
String color = "블랙";
// 새로운 제품 개발
String modelName2 = "하양이";
String resolution2 = "UHD";
int price2 = 300000;
String color2 = "화이트";
이렇게 데이터를 하나하나 집어넣는것이 너무 귀찮아진것..
BlackBox bbox = new BlackBox();
BlackBox bbox2 = new BlackBox();
저 많은 줄을 이렇게 한줄의 객체로 만들 수가 있다. 그리고 이 객체는 인스턴스 객체 라고 한다.
3. 인스턴스 변수
3-1. 인스턴스 변수를 선언해보자
1. 원하는 이름의 javaclass를 만든다 나는 blackbox로 만들었다!
// Blackbox.java
// 인스턴스 변수
// 서로 다른 객체에서 서로 다른 값들을 가진다.
String modelName;
String resolution;
int price;
String color;
블랙박스라는 자바클래스안에 이렇게 인스턴스 변수들을 선언하였다. 이 변수들은 값을 어떻게 할당하느냐에 따라서 값이 달라질것이다.
// 처음 만든 블랙박스
// b1이라는 객체 만들기
BlackBox b1 = new BlackBox();
b1.modelName = "까망이";
b1.resolution = "FHD";
b1.price = 200000;
b1.color = "블랙";
// 새로운 블랙박스
BlackBox b2 = new BlackBox();
b2.modelName = "하양이";
b2.resolution = "UHD";
b2.price = 300000;
b2.color = "화이트";
이렇게 클래스를 하나 만들고 원하는 값만 할당해주면 변수를 하나하나 선언하는것 보다 쉽게 만들 수 있다. 또한 하나하나의 그룹으로 묶여 있기 때문에 유지보수도 수월하다.
4. 클래스 변수
스태틱 변수라고도 하는 고정변수를 만들어보자
4-1. 충돌이 생기면 바로 경찰서로 전화해주는 프로그램 만들어보기
미리 만들어놓은 클래스를 호출해주고 모델 이름을 할당해줬다.
Blackbox b1 = new Blackbox();
b1.modelName = "까망이";
BlackBox b2 = new BlackBox();
b2.modelName = "하양이";
다음 Blackbox 클래스에 원하는 기능을 집어넣어준다
static boolean canAutoReport = false;
canAutoReport라는 변수를 선언하고 false를 기본으로 만들어주었다(충돌 감지 기능이 개발 안된 상태)
이런 스태틱 변수는 이 클래스로 만들어지는 모든 객체에 똑같이 적용된다. 그래서 인스턴스 변수는 값할당을 안해주는 반면 스태틱 변수는 값 할당을 해준다
// ⭐️ 특정 범위를 초과하는 충돌 감지시 자동 신고기능 개발 여부
// 개발전
System.out.println(b1.modelName + " 자동신고기능 " + b1.canAutoReport);
System.out.println(b2.modelName + " 자동신고기능 " + b2.canAutoReport);
// 스태틱으로 선언된 클래스 변수는 클래스 자체를 적어줘야한다.
System.out.println("모든 블랙박스 제품 자동 신고 기능 : " + BlackBox.canAutoReport); // 모든 블랙박스 제품 자동 신고 기능 : false
// 개발후
BlackBox.canAutoReport = true;
System.out.println(b1.modelName + " 자동신고기능 " + b1.canAutoReport);
System.out.println(b2.modelName + " 자동신고기능 " + b2.canAutoReport);
// 스태틱으로 선언된 클래스 변수는 클래스 자체를 적어줘야한다. 권장 방식임!
System.out.println("모든 블랙박스 제품 자동 신고 기능 : " + BlackBox.canAutoReport); // 모든 블랙박스 제품 자동 신고 기능 : true
이렇게 호출 가능하지만 기본적으로 스태틱 변수는 클래스 자체를 적는것이 국룰이다.
5. 메소드
그럼 이 기능을 직접 만들어보자
void autoReport(){
if(canAutoReport){
System.out.println("충돌이 감지되어 자동으로 신고합니다.");
}else{
System.out.println("자동 신고기능이 지원되지 않습니다.");
}
}
canAutoReport가 true면 자동으로 신고한다는 문구가 나오도록 Blackbox 클래스에 메소드를 만들어주었다.
BlackBox b1 = new BlackBox();
b1.modelName = "까망이"; // 변수 호출
b1.autoReport(); // 지원 안되는 상태
// 지원하게 해보기
BlackBox.canAutoReport = true; // false를 true로 바꿈
b1.autoReport(); // 지원 됨.
5-1. 파라미터 받아서 처리해보기
5-1-1. sd카드가 삽입 되어있는지 확인을 해보는 코드 만들어보자
b1.insertMemoryCard(256);
insertMemoryCard라는 이름으로 메소드를 만들 것이다. 안에 들어가는 숫자는 용량을 표시한다
void insertMemoryCard(int capacity){
System.out.println("메모리 카드가 삽입되었습니다.");
System.out.println("용량은 " + capacity + "GB 입니다.");
}
// 원래 파일
b1.insertMemoryCard(256, false);
// Blackbox 클래스 파일
void insertMemoryCard(int capacity, boolean insert){
if(insert == true){
System.out.println("메모리 카드가 삽입되었습니다.");
System.out.println("용량은 " + capacity + "GB 입니다.");
}else{
System.out.println("메모리 카드를 삽입해주세요.");
}
이렇게 벨리데이션을 줄 수도 있을 듯 하다. 연습하면서 만들어봤음
5-2. 메모리카드안에 있는 영상 개수 출력
// 원래 파일
// 메모리에 있는 영상 개수 반환하기
// 일반영상 : 1
// 이벤트 영상 (충돌 감지) : 2
int fileCount = b1.getVideoFileCount(1); // 일반영상
// Blackbox 클래스 파일
void getVideoFileCount(int type){
if(type == 1){
return 9; // 임의의 동영상 개수
}else if(type == 2){
return 1;
}else{
return 10;
}
}
6. 메소드 오버로딩
기본값을 주고싶을때 사용하면 좋을 것 같다.
void record(boolean showDateTime, boolean showSpeed, int min){
System.out.println("녹화를 시작합니다.");
if(showDateTime){
System.out.println("영상에 날짜 정보가 표시됩니다.");
}
if(showSpeed){
System.out.println("영상에 속도정보가 표시됩니다.");
}
System.out.println("영상은 " + min + "분 단위로 기록됩니다.");
}
void record(){
record(true, true, 5);
}
이렇게 메소드안에 메소드를 호출해서 인자를 적으면
b1.record();
인자를 적지 않고 메소드를 호출했을 때 오버로딩으로 적은 메소드들이 호출된다
7. 클래스 메소드
충돌시 고객센터에 전화하는 기능을 만들어보자.
// 블랙박스 클래스
static void callServiceCenter(){
System.out.println("서비스센터(1588-0000) 로 연결합니다.");
// modelName = 'test'; 스태틱 안에서는 인스턴스 변수수정 불가능함
// canAutoReport = false; 클래스 변수는 수정 가능
}
주의할 점은 스태틱은 스태틱 끼리 수정이 가능하다.
public class _06_ClassMethod {
public static void main(String[] args) {
BlackBox b1 = new BlackBox();
// 🧐 고객 센터에 전화하는 기능 만들어보자
b1.callServiceCenter();
// 클래스 이름으로 바로 접근 가능 객체 안만들어도 댐!!
BlackBox.callServiceCenter(); // 서비스센터(1588-0000) 로 연결합니다.
}
}
8. This
블랙박스의 기능과 디자인이 구려서 최신형을 만들었다.
void appendModelName(String modelName) {
// modelName += modelName; // modelName은 이름이 같다! 최신형 += 최신형임
this.modelName += modelName; // this : 인스턴스 객체, this.modelName = 인스턴스 변수 modelName(맨위의 것)
}
this는 인스턴스 객체를 가리키기 때문에 블랙박스 클래스의 인스턴스 객체(코드 맨위에 있는것)의 modelName 변수를 가져와야 한다. 위 코드처럼 modelName += modelName 이라고 한다면 아래 코드에서 받아온 인자에 인자를 더해준것 밖에 안된다.
public class _07_This {
public static void main(String[] args) {
BlackBox b1 = new BlackBox();
// 메소드에 새로운 이름을 추가해보자!
b1.modelName = "까망이"; // 까망이(최신형)
b1.appendModelName("(최신형)");
System.out.println(b1.modelName);
}
}
9. 생성자(constroctor)
9-1. 생성자 만들어보기
매번 인스턴스 변수에 값을 할당하기 귀찮다 그럴때 생성자를 써서 미리 값을 할당해놓으면 편하다
// 블랙박스 클래스
BlackBox(String modelName, String resolution, int price, String color){
this.modelName = modelName;
this.resolution = resolution;
this.price = price;
this.color = color;
}
변수들을 미리 인자로 받아놓고 this에 값을 할당해 놓으면 된다.
public class _08_Constructor {
public static void main(String[] args) {
BlackBox b1 = new BlackBox();
BlackBox b2 = new BlackBox("하양이", "UHD", 300000,"화이트");
System.out.println(b2.modelName); // 하양이
System.out.println(b2.resolution); // UHD
System.out.println(b2.price); // 300000
System.out.println(b2.color); // 화이트
}
}
9-2. 시리얼 넘버 출력해보기
각각 블랙박스의 시리얼 넘버를 출력해보자
// 블랙박스 클래스
int serialNumber; // 시리얼 넘버 변수 생성
static int counter = 0 // 모든 클래스에 공통으로 들어가기 때문에 static으로 설정
BlackBox() {
System.out.println("기본 생성자 호출️");
this.serialNumber = ++counter;
System.out.println("새로운 시리얼 넘버를 발급 받았습니다 : " + this.serialNumber);
}
// 생성자 사용해서 변수에 미리 할당하기
BlackBox(String modelName, String resolution, int price, String color){
this(); // 기본생성자(여기선 위 먼저 실행되고 밑에꺼 실행된다.)
System.out.println("기본 생성자 호출️");
this.modelName = modelName;
this.resolution = resolution;
this.price = price;
this.color = color;
}
블랙박스 클래스를 하나 생성할때 마다 counter에 1이 더해지면서 시리얼 넘버가 생길듯.
위의 this는 그냥 괄호만 넣어놓으면 기본생성자가 먼저 실행된다. 여기서는 인자가 없는 가장 위의 생성자가 실행되고 밑의 코드가 실행된다.