✍🏻 객체 지향 프로그래밍 (OOP)

Object-Oriented Programming
: 객체(부품)들끼리 서로 어우러진 형태로 프로그램을 구성

  • 객체 지향 프로그래밍 언어 특징
    -유지 보수 용이
    -높은 재사용성

✍🏻 클래스

01. 클래스

서로 다른 자료형이지만 비슷한 것들끼리 모아둔 하나의 공간 (현재 수준에서 표현해봄 _나중에 수정)

  • 클래스 선언 방법
    public class 클래스 이름{ }
    -클래스 이름은 대문자로 시작하는 여러 단어들의 조합으로!
public class BlackBox{	
    
    }

  • 클래스로(설계도) 부터 객체(부품, 결과물) 생성 방법
    클래스이름 객체이름 = new 클래스이름();
	BlackBox b1 = new BlackBox();
    //BlackBox 클래스로부터 b1 객체 생성
    //b1객체는 BlackBox클래스의 인스턴스다

02. 인스턴스 변수 (filed)

  • 클래스에는 데이터를 저장하는 변수를 정의할 수 있다.
  • 객체들마다 서로 다른 값을 가질 수 있다.
  • 인스턴스 변수 정의
	//클래스에 정의 되어 있는 인스턴스 변수
	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 = "화이트";
	}

03. 클래스 변수 (static 키워드)

  • 클래스를 설계할 때, 모든 객체에서 같은 값이 유지되어야 하는 변수
  • 클래스 변수의 값을 바꾸면 해당 클래스로부터 만들어진 모든 객체의 클래스 변수 값이 바뀐다.
  • 클래스 변수 정의
	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
    }

04. 메소드

  • 클래스에는 기능을 수행하는 메소드도 정의할 수 있다.
  • 객체들마다 서로 다른 동작을 할 수 있다.
  • 메소드 정의
	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);

05. 메소드 오버로딩

  • 이름이 같은 메소드를 여러개 만드는 것.
  • 매개변수의 개수, 또는 타입이 달라야한다.
	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);
    }

06. 클래스 메소드 (static 키워드)

  • 모든 객체에 공통적인 동작이 적용된다.
  • 클래스 메소드는 인스턴스 변수를 사용할 수 없다.
  • 인스턴스 변수는 객체가 만들어져야 만들어지기 때문에 클래스 메소드에서는 직접 접근 불가
    -클래스 메소드 내에서 인스턴스 변수의 사용이 필요없는 경우 클래스 메소드를 사용할 수 있다.
  • static으로 선언한 클래스 변수는 클래스 메소드에서 바로 사용 가능
  • 클래스 메소드 정의
	//클래스 메소드에는 stiatic 붙여주기
    
    static void callServiceCenter() {
        System.out.println("서비스 센터(1588-0000)로 연결합니다.");
        
        modelName = "test"; //인스턴스 변수는 클래스 메소드에서는 직접 접근 불가
        canAutoReport = false; //클래스 변수는 클래스 메소드에서 바로 사용 가능
    }

07. this

  • this 는 참조변수로 인스턴스 자신을 가리킨다.
  • 메소드 내에서 사용하려는 인스턴스 변수 이름과 생성자의 매개변수의 이름이 같을 때,
    -인스턴스 변수 이름 앞에 this. 을 붙여 인스턴스 변수라는 것을 명확히 해준다
	//this 를 붙여줌으로써 클래스의 인스턴스 변수에 직접 접근 가능
    void appendModelName(String modelName) {
        this.modelName += modelName;
    }
  • static 메소드에서는 this 사용 불가

08. 생성자 (Constructor) 🌕

객체가 생성될 때 자동으로 호출되는 (반환형이 없는)메소드

  • 초기화 작업을 생성자에서 할 수 있다
    -객체가 생성됨과 동시에 반드시 해야되는 동작 명시 하고자 할 때
    -객체가 생성됨과 동시에 전달값으로 초기화를 하고자 할 때
  • 생성자 정의 클래스 이름(){ }
    -클래스 아래에서 보통은 인스턴스 변수 다음에 정의
    -클래스 명과 동일하게 (생성자에는 반환형이 없다!)
	//생성자는 클래스 이름과 동일하게 정의
    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);
    }
    
    }
  • 메소드 오버로딩 하듯 생성자도 오버로딩 가능 (_같은 이름으로 여러개 만드는 것)
    -생성자 간에도 서로 호출 가능 this() 사용
    -같은 클래스 내 생성자들은 일반적으로 서로 관계가 깊은 경우가 많아서 서로 호출하도록 하여 유기적으로 연결
    -수정이 필요한 경우, 적은 코드만 변경해주면 되어 유지보수가 편해진ㄴ다.
    -단, 한 생성자에서 다른 생성자를 호출할 떄는 반드시 첫 줄에서만 호출 가능
	 //객체가 생성됨과 동시에 전달값으로 초기화를 하고자 할 때 
     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, "화이트");
        
    
    }

09. getter 와 setter

  • getter

    값을 가지고 오는 메소드
    -값이 없거나 이상할때 대안으로 줄 수 있는 값을 설정할 수 있다.

	//해상도 값을 가지고 오는 메소드 (현재 해상도 값이 없거나 비어있는 상황)
    String getResolution(){
    	if (Resolution == null || Resolution.isEmpty()){
        	return "판매자에게 문의하세요.";
        }
    	return resolution;
    }
    
    //가격 값을 가지고 오는 메소드
    int getPrice(){
    	return price;
    }
    
  • setter

    값을 설정하는 메소드 전달값있음
    -값을 설정할 때 발생할 수 있는 오류를 줄일 수 있다.

	//해상도 값을 설정하는 메소드
    void setResolution(String resolution){
    	this.resolution = resolution;
    }
    
    //가격 값을 설정하는 메소드 (현재 가격 값이 잘못 설정되어 있는 상황)
    void setPrice(int price){
    	if (price < 100000){
        	this.price = 100000;
        } else{
    		this.price = price;
        }
    }

10. 접근 제어자

  • 캡슐화와 정보은닉을 할 수 있게 해준다.

접근 제어자 종류
-public : 모든 클래스에서 접근 가능 (접근 제한 X)
-private : 해당 클래스 내에서만 접근 가능
-(default) : 같은 패키지 내에서만 접근 가능
-protected : 같은 패키지 내에서 & 다른 패키지의 자식클래스에서 접근 가능

캡슐화 (encapsulation)
: 서로 필요한, 연관된 것들끼리만 하나의 캡슐에 담는다.
-예시, 블랙박스 클래스인 경우 블랙박스와 관련된 변수, 기능들끼리만 하나의 클래스로 정의

정보은닉 (information hiding)
: 정보를 숨기는 것
-예시, 객체 내에 있는 변수나 메소드에 직접적으로 접근하는 것을 막고 객체에서 허용해주는 것을 통해서만 접근 가능

  • 자바 파일 내에는 클래스를 여러개 만들 수 있다.
    -단, public으로 정의하게 되면 클래스이름과 자바 파일 이름이 반드시 일치해야 한다!!

11. 패키지

패키지
: 하나의 프로젝트를 진행할 때 여러개의 클래스로 이루어지는데,
서로 연관된 클래스들끼리 묶어 정리해주는 역할 (폴더구조)

  • 다른 패키지에 있는 클래스를 가져다가 쓰고 싶을 때
    -import
	import chap_07.BlackBoxRefurbish; //chap_07패키지에 있는 BlackBoxRefurbish 클래스를 가져다 쓴다.
    import chap_07.*; //chap_07패키지에 있는 모든 클래스를 가져다 쓴다.

구글 검색 : 자바 유용한 클래스

  • Math, Scanner, StringBuilder, StringBuffer, StringTokenizer
  • BigInteger, BigDecimal
  • LocalDate, LocalTime, LocalDateTime, DateTimeFormatter...
  • Random number 받아오기
	int num = (int) (Math.random() * n) + start;

	// 주사위 번호 하나 뽑기
	int num = (int) (Math.random() * 6) + 1;
	// 로또 번호 하나 뽑기
	int num = (int) (Math.random() * 45) + 1;

12. 상속 🌚

상속 extends
: 부모 클래스에서 제공되는 모든 것들을 자식 클래스에서 가져다 쓰게된다.
: is a 관계

13. 메소드 오버라이딩 🌚

메소드 오버라이딩
: 상속받은 메소드를 자식 클래스 자신에 맞게 변경해 사용하는 것 (재정의)

  • 메소드의 내용만을 새로 작성하는 것이므로, 이름, 매개변수, 반환타입은 부모의 것과 완전히 일치해야한다
    -접근제어자, 예외는 제한된 조건하에 다르게 변경 가능
  • 접근 제어자는 부모 클래스의 메소드보다 좁은 범위로 변경 할 수 없다.
  • 부모 클래스의 메소드보다 더 많은 수의 예외를 선언할 수 없다.

오버로딩 : 기존에 없던 새로운 메소드를 정의하는 것
오버라이딩 : 상속받은 메소드의 내용을 변경하는 것

14. 다형성 🌚

15. super 🌚

16. 참조 (reference) 🌕

  • 기본타입(정수, 실수, 논리)은 실제 값을 변수 안에 저장
  • 참조타입(배열, 열거, 클래스, 인터페이스)은 메모리의 번지를 변수 안에 저장하며 번지를 통해 객체를 참조
  • String 역시 참조타입이기 때문에
    String name = "박유영" 와 String name = new String("박유영")는 다르다!!
    같은 객체이든 아니든 관게 없이 비교하기 위해서는 equals()메소드를 사용해야 한다

17. 상수 (final 키워드)

*final : 마지막의, 변경될 수 없는

어떤 변수를 Final로 선언하게 되면 선언과 동시에 초기화를 하고,
그 이후에는 값을 사용할 수는 있지만 값을 변경하는 것은 불가능하다

  • 선언과 동시에 값을 (직접) 초기화
	public final String lens = "광각렌즈";
  • 선언만 해두고 생성자 내에서 초기화
	public class ActionCam {
    	public final String lens;
        
 		public ActionCam() {
		lens = "광각렌즈";   
        //생성자는 객체가 만들어 지는 시점에 자동으로 호출 되기 때문에 두가지 방법 가능
    }
     }
  • 키워드 순서 : public > abstract > static > final > ...
  • cf.
    -abstract : 미완성의

18. 열거형 (enum) 🌕

Enum : 상수들의 묶음 (특수한 형태의 클래스)

-달력 : JAN, FEB, MAR...
-옷 사이즈 : S, M, L, XL...
-OS 종류 : WIN10, WIN11, MACOS, LINUX ...
-해상도 : HD, FHD, QHD, UHD ...

  • 상수들의 묶음이기 때문에 enum이 가지는 값들은 대문자로 정의해서 구분해줌
  • enum 선언 방법
	//Resolution이라는 열거형은 HD, FHD, UHD라는 3개의 상수를 가진다.
	enum Resolution {
    	HD, FHD, UHD
    }
  • main코드에서 enum 만드는 방법
	public static void main(String[] args){
    	Resolution resolution = Resolution.HD;
        System.out.println(resolution); //HD

Enum을 사용하는 이유
데이터를 결합하여 클래스의 필드처럼 각각의 데이터를 언제나 연관지어 사용할 수 있다는 점

0개의 댓글