Object-Oriented Programming
: 객체(부품)들끼리 서로 어우러진 형태로 프로그램을 구성
서로 다른 자료형이지만 비슷한 것들끼리 모아둔 하나의 공간 (현재 수준에서 표현해봄 _나중에 수정)
public class BlackBox{
}
BlackBox b1 = new BlackBox();
//BlackBox 클래스로부터 b1 객체 생성
//b1객체는 BlackBox클래스의 인스턴스다
//클래스에 정의 되어 있는 인스턴스 변수
public class BlackBox {
String modelName;
String resolution;
int price;
String color;
}
public static void main(String[] args) {
//BlackBox클래스로부터 b1이라는 객체를 만들고
//객체의 4개의 인스턴스 변수에 대해서 각각 값을 지정해줌
BlackBox b1 = new BlackBox();
b1.modelName = "까망이";
b1.resolution = "FHD";
b1.price =200000;
b1.color = "블랙";
//BlackBox클래스로부터 b2이라는 새로운 객체를 만들고
//객체의 4개의 인스턴스 변수에 대해서 b1 객체와는 다른 값 지정 가능
BlackBox b2 = new BlackBox();
b1.modelName = "하양이";
b1.resolution = "UHD";
b1.price =300000;
b1.color = "화이트";
}
public class BlackBox {
static boolean canAutoReport = false;
//클래스로부터 만들어진 객체에,
공통적으로 적용해야 하는 값이 있을 땐
인스턴스 변수가 아닌 클래스변수로 정의!!
}
public static void main(String[] args) {
System.out.println(BlackBox.canAutoReport); //false
canAutoReport = true;
System.out.println(BlackBox.canAutoReport); //true
}
void autoReport() {
if (canAutoReport) {
System.out.println("충돌이 감지되어 자동으로 신고합니다.");
} else {
System.out.println("자동 신고 기능이 지원되지 않습니다.");
}
}
//전달값 있는 메소드 정의
void insertMemorycard(int capacity){
System.out.println("메모리 카드가 삽입되었습니다.");
System.out.println("용량은 " + capacity + "GB 입니다.");
}
b1.autoReport();
b2.insertMemorycard(256);
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);
}
//클래스 메소드에는 stiatic 붙여주기
static void callServiceCenter() {
System.out.println("서비스 센터(1588-0000)로 연결합니다.");
modelName = "test"; //인스턴스 변수는 클래스 메소드에서는 직접 접근 불가
canAutoReport = false; //클래스 변수는 클래스 메소드에서 바로 사용 가능
}
//this 를 붙여줌으로써 클래스의 인스턴스 변수에 직접 접근 가능
void appendModelName(String modelName) {
this.modelName += modelName;
}
객체가 생성될 때 자동으로 호출되는 (반환형이 없는)메소드
//생성자는 클래스 이름과 동일하게 정의
BlackBox(){ }
//반드시 해야되는 동작 명시 하고자 할 때
public class BlackBox{
int serialNumber;
static int counter = 0;
BlackBox() {
//this("까망이", "HD", 3000, "블랙"); //생성자에서 다른 생성자 호출 가능
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;
}
public static void main(String[] args){
BlackBox b1 = new BlackBox();
BlackBox b2 = new BlackBox("하양이", "UHD", 2000, "화이트");
}
값을 가지고 오는 메소드
-값이 없거나 이상할때 대안으로 줄 수 있는 값을 설정할 수 있다.
//해상도 값을 가지고 오는 메소드 (현재 해상도 값이 없거나 비어있는 상황)
String getResolution(){
if (Resolution == null || Resolution.isEmpty()){
return "판매자에게 문의하세요.";
}
return resolution;
}
//가격 값을 가지고 오는 메소드
int getPrice(){
return price;
}
값을 설정하는 메소드 전달값있음
-값을 설정할 때 발생할 수 있는 오류를 줄일 수 있다.
//해상도 값을 설정하는 메소드
void setResolution(String resolution){
this.resolution = resolution;
}
//가격 값을 설정하는 메소드 (현재 가격 값이 잘못 설정되어 있는 상황)
void setPrice(int price){
if (price < 100000){
this.price = 100000;
} else{
this.price = price;
}
}
접근 제어자 종류
-public : 모든 클래스에서 접근 가능 (접근 제한 X)
-private : 해당 클래스 내에서만 접근 가능
-(default) : 같은 패키지 내에서만 접근 가능
-protected : 같은 패키지 내에서 & 다른 패키지의 자식클래스에서 접근 가능
캡슐화 (encapsulation)
: 서로 필요한, 연관된 것들끼리만 하나의 캡슐에 담는다.
-예시, 블랙박스 클래스인 경우 블랙박스와 관련된 변수, 기능들끼리만 하나의 클래스로 정의
정보은닉 (information hiding)
: 정보를 숨기는 것
-예시, 객체 내에 있는 변수나 메소드에 직접적으로 접근하는 것을 막고 객체에서 허용해주는 것을 통해서만 접근 가능
패키지
: 하나의 프로젝트를 진행할 때 여러개의 클래스로 이루어지는데,
서로 연관된 클래스들끼리 묶어 정리해주는 역할 (폴더구조)
import chap_07.BlackBoxRefurbish; //chap_07패키지에 있는 BlackBoxRefurbish 클래스를 가져다 쓴다.
import chap_07.*; //chap_07패키지에 있는 모든 클래스를 가져다 쓴다.
구글 검색 : 자바 유용한 클래스
int num = (int) (Math.random() * n) + start;
// 주사위 번호 하나 뽑기
int num = (int) (Math.random() * 6) + 1;
// 로또 번호 하나 뽑기
int num = (int) (Math.random() * 45) + 1;
상속 extends
: 부모 클래스에서 제공되는 모든 것들을 자식 클래스에서 가져다 쓰게된다.
: is a 관계
메소드 오버라이딩
: 상속받은 메소드를 자식 클래스 자신에 맞게 변경해 사용하는 것 (재정의)
오버로딩 : 기존에 없던 새로운 메소드를 정의하는 것
오버라이딩 : 상속받은 메소드의 내용을 변경하는 것
*final : 마지막의, 변경될 수 없는
어떤 변수를 Final로 선언하게 되면 선언과 동시에 초기화를 하고,
그 이후에는 값을 사용할 수는 있지만 값을 변경하는 것은 불가능하다
public final String lens = "광각렌즈";
public class ActionCam {
public final String lens;
public ActionCam() {
lens = "광각렌즈";
//생성자는 객체가 만들어 지는 시점에 자동으로 호출 되기 때문에 두가지 방법 가능
}
}
Enum : 상수들의 묶음 (특수한 형태의 클래스)
-달력 : JAN, FEB, MAR...
-옷 사이즈 : S, M, L, XL...
-OS 종류 : WIN10, WIN11, MACOS, LINUX ...
-해상도 : HD, FHD, QHD, UHD ...
//Resolution이라는 열거형은 HD, FHD, UHD라는 3개의 상수를 가진다.
enum Resolution {
HD, FHD, UHD
}
public static void main(String[] args){
Resolution resolution = Resolution.HD;
System.out.println(resolution); //HD
Enum을 사용하는 이유
데이터를 결합하여 클래스의 필드처럼 각각의 데이터를 언제나 연관지어 사용할 수 있다는 점