본문 바로가기
❤️‍🔥TIL (Today I Learned)

[TIL] 2022-11-17(14day)

by elicho91 2022. 11. 17.

👉 객체 지향 

 

코드 재사용성이 높다 : API 사용
코드 관리가 쉽다 : 상속, 다향성, 추상화. 캡슐화
신뢰성이 높은 프로그램 개발 가능

-1) 캡슐화 (encapsulation) : 자바가 지향하는 코드 스타일

     # 데이터와 관련 기능을 묶는다.

     # 객체가 어떻게 행동(기능)하는지 외부에 노출하지 않는다.

     # 정보 은닉

     # 객체 내부 행동(기능)이 변경 되더라도, 외부에 영향을 주지 않는다.

 

-2) 상속 (inheritance)


-3) 다형성 (polymorphism)

     # 다양한 모습을 갖는 것

     # 한 객체가 다양한 타입을 갖는 것

     # 한 객체가 여러 타입의 기능을 제공

     # 타입 상속으로 다형성 구현 (상속관계에서 성립)

     # 같은 이름의 기능이 클래스나 객체에 따라 다르게 동작하도록 구현되는 것.


👉 접근제어자 (access modifier)

private : 같은 클래스 내에서만 접근이 가능.

default(nothing) : 같은 패키지 내에서만 접근이 가능.
protected : 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능.
public : 접근 제한이 전혀 없음.


👉 클래스와 객체


-1) 클래스 (설계도) == 붕어빵 틀
객체를 정의해 놓은 것, 용도는 객체를 만들기 위한 것

-2) 객체(인스턴스) == 붕어빵
실제로 존재하는 것, 클래스 모양 (설계) 그대로 생성된 실체

-3) 객체 : 속성 + 기능
속성과 기능을 통틀어 맴버라고 부른다.
속성 : 맴버변수, 필드
기능 : 매서드 

-4) 객체를 생성과 사용

class Phone { //Phone 이라는 클래스
    String model; //변수(속성)와 메서드(기능)
    String color;
    int price;
}

public class Main {
    public static void main(String[] args) {
        Phone galaxy = new Phone(); //Phone의 속성을 가진 galaxy 인스턴스 생성
        galaxy.model = "Galaxy10";
        galaxy.color = "Black";
        galaxy.price = 100;
        
        Phone iphone =new Phone(); //Phone의 속성을 가진 iphone 인스턴스 생성
        iphone.model = "iPhoneX";
        iphone.color = "Black";
        iphone.price = 200;
        

        System.out.println("철수는 이번에 " + galaxy.model + galaxy.color + " + 색상을 " + galaxy.price + "만원에 샀다.");
        System.out.println("영희는 이번에 " + iphone.model + iphone.color + " + 색상을 " + iphone.price + "만원에 샀다.");
    }
}


#1. 클래스명은 첫글자 대문자, 숫자로 시작 X, 띄어쓰기 X, 특수기호 _ $ 만 허용
패키지내 클래스명은 한개만 존재해야함.

#2. 객체 생성
**선언**
클래명 참조변수명; : String str;


**생성**
참조변수명 = new 클래스 명 ()

**선언 + 생성 **
클래스명 참조 변수명 = new 클래스명 ();
Scanner sc = new Scanner();

참조 변수 (레퍼런스 변수) : 객체를 가르키는, 객체의 주소 (레퍼런스)
new : 클래스 모양의 메모리를 점유하는 문법적으로 중요한 키워드

 

#3. 객체 사용
참조변수명.변수 = 값;
참조변수명.메서드();


 ---> 정리
클래스 == 사용자 정의 데이터 타입
기본형 : 메모리 양이 정해진것
클래스 : 개발자가 필요한 만큼 메모리 크기를 직접 지정해서 만든것.
클래스 : 유사한 특징을 지닌 객체들의 속성과 기능을 묶어 놓은 집합



👉 변수의 종류


: 선언 위치(어디서 변수가 만들어졌느냐)에 따라 변수의 종류와 성질이 달라짐.

-1) 클래스 변수  (static 변수)
- 클래스 안에 생성 (메서드 밖)
- 이름앞에 static 키워드가 붙는다

- 종류 : 클래스 기본형 변수(int string) / 클래스 참조형 변수(tv.. /
- 특징 : 모든 객체들이 공유하는 변수
 프로그램시작하면 먼저 한번만 로딩하고,
 new로 객체생성하지 않아도 바로 사용가능.
- 접근방법 
클래스명.변수명
참조변수명.변수명

-2) 인스턴스 변수 
- 클래스 안 생성 (메서드 밖)
- 종류 : 인스턴스 기본형 변수 / 인스턴스 참조형 변수 
- 특징 : 각 객체(인스턴스)의 개별적인 저장 공간 갖는다.
new~ 로 객체생성한 후 메모리가 점유되면 사용가능.
가르키는 참조변수가 없을 경우 가비지 컬렉터가 수거 or 프로그램 종료시 소멸됨.
- 접근 방법
참조변수명. 변수명

-3) 지역 변수   
- 메서드 안 생성
- 종류 : 지역 기본형(int, char 소문자) 변수 / 지역 참조형(Scanner, String 대문자) 변수
- 특징 : 메서드 (,조건문 , 반목문) 내에서 선언된 변수를 가르키며, 메서드 종료시 소멸

# 메모리 로딩순서
클래스 영역-> static -> main 실행 -> (new~~) 인스턴스 생성 
:클래스 범위 만들고
| static 붙은 아이들 모두 로딩
|메인 있다면 실행
| new로 객체 생성된 아이들 실행



👉 메서드 method


-1) 메서드 : 함수
어떠한 작업을 수행하기 위한 명령문들의 집합. main()도 메서드
메서드 -> 연산을 처리하는 곳
변수 -> 그 결과를 저장하는 곳
메서드는 어떤 값을 입력 받아 처리하고, 그 결과(하나만)를 돌려준다. (입력값, 리턴값 유/무)

목적, 장점 : 재사용 : 반복적인 코드를 줄이고 코드 관리가 용이함.
ex) System.out.println(); 출력해주는 메소드

-2) 메서드의 정의와 사용
#1. 입력값 x , 리턴값 x
#정의
리턴타입 메서드명(){
실행할 코드들
}


#사용(호출)
메서드명();

#2. 입력값 o , 리턴값 o

int add(int x, int y) { //타입 파라미터명, 타입 파라미터명
    int result = x + y; //실행할 코드
    return result; //리턴값
}


#사용
메서드명(인자, 인자,....); 


-3) 용어 정리
리턴타입 : 메서드의 작성된 코드를 실행하고 리턴해주는 결과의 타입.
모든 타입이 될 수 있고, 리턴해줄것이 없다면 void 라고 작성.

메서드명 : 변수명명규칙 참고 (소문자) , 무슨 작업을 하는지 유추 가능한 이름으로 만들기
파라미터 : 매개변수, arguments
메서드를 실행할때(부를떄) 외부에서 던져주는 데이터를 받아주는 변수
메서드에 입력받을 값을 담아주는 변수
외부에서 던져주는 값이 없다면 괄호안 비워두기

return   : 함수를 호출한 곳으로 값을 돌려주는 키워드
1) 메서드를 종료시킴
2) 뒤에 작성한 값을 호출한 곳으로 
리턴타입이 void가 이 아닌 이상 반드시 return 값이 있어야한다.
리턴타입과 return 뒤에 기입할 데이터의 타입이 동일해야함.
void 타입에서도 어떤 조건에 의해 메서드가 중간에 강제종료하고 싶을때는 return; 값 없이 키워드만 사용가능
인자(파라미터) : 매개변수, 인수, 인자값, 인수값, 파라니처, arguments
메서드 호출시, 메서드에게 던져줄 데이터를 말함.

🔥 인자와 파라미터의 개수/순서/데이터타입은 반드시 일치해야함.

-4) 메서드의 종류
#1. 클래스 메서드 : static이 붙은 메서드 (객체 생성안하고❌ 바로 사용가능)

#2. 인스턴스 메서드 : 일반메서드 (객체 생성✔️ 후 사용가능)
(같은 클래스안에 있는 애들을 부를때는 메모리 생성 시기가 같아서 객체생성 안해도 됨.)

-5) main() 메서드
public static void main(String[] args){
}

 


👉 메서드 인자 전달 방식


자바의 인자 전달 방식은 "값의 의한 호출 : Call-by-value" 이다.
호출하는 곳에서의 인자값이 복사되어 파라미터에게 전달된다.

1) 기본형 값 전달 : read only : 값만 복사해줌. 원본 훼손 x
2) 참조형 값 전달 : read & write : 객체의 레퍼런스(주소값)이 전달된다.


👉 추상클래스

  • 기본적으로 클래스이다. 상속, 확장하여 사용하기 위한 것
  • 여러 하위 클래스가 동일한 구현으로 로직을 수행 + 일부 로직이 다를 때 추상클래스 사용 고민 (Template Method 패턴)

# 클래스를 상속받아 이용 및 확장을 위함

   (부모의 기능을 확장하는 개념)

#다중 상속 불가능 , 단일 상속

# extends를 이용하여 구현

# 추상메소드에 대한 구현 가능

# 생성자와 일반변수 모두 가질 수 있다.


-1) 설계와 구현을 분리한다면, 설계부분에 해당
-2) 키워드 : abstract
-3) 추상메서드 : abstract 키워드를 붙혀 메서드의 선언분(원형)만 있고
구현은 되어있지 않은 형태 (중괄호 부분 없음) 
  public String getNAme(){} 이지만 
->로 표현 public abstract String getName();


-4) 추상클래스 : 일반 맴버 (변수, 메서드)들과 함께 추상 메서드를 포함하는 클래스
추상 메서드가 하나라도 있으면 무조건 추상 클래스
추상 클래스가에는  abstract 키워드를 붙혀야 한다.

abstract class Sharpe{ // 추상클래스
int a ;
abstract void draw(); //추상 메서드
}

-5) 추상 클래스로는 객체 생성 불가!! 불완전한 / 미완성인 클래스이므로 메모리에 올릴 수 없다
Shape s = new Shape ();   -----> (X)
Shape s;  ----> (O) 변수 선언만은 괜찮다.

-6) 상속에서 수퍼클래스로 사용된다. 부모 클래스 될 수 있음. extends 키워드로 상속시킬수 있다.

-7) 추상클래스를 물려받은 자식클래스를 완성시키려면 추상메서드를 오버라이딩(내용물 구현)해야한다.
추상클래스를 단순히 상속만 받은 자식클래스는 그 또한 추상클래스가 된다.

# 추상 클래스 단순 상속  : 상속받은 추상 메서드 구현 안하면,
abstract class Rect extends Shape {
int width
}

# 추상 클래스를 상속 + 구현 
class Rect extends Shape {
int width;
@override
void draw(){....
}
}

8) 추상클래스를 상속받은 자식클래스는 개발자들이 추상메서드를 모두 구현해야함.
-> 추상 클래스를 가이드라인,
자식 클래스는 가이드를 따른 구현된 사용가능한 실제 클래스

 

abstract class Bird {
    private int x, y, z;

    void fly(int x, int y, int z) {
        printLocation();
        System.out.println("이동합니다.");
        this.x = x;
        this.y = y;
        if (flyable(z)) {
            this.z = z;
        } else {
            System.out.println("그 높이로는 날 수 없습니다");
        }
        printLocation();
    }

    abstract boolean flyable(int z);

    public void printLocation() {
        System.out.println("현재 위치 (" + x + ", " + y + ", " + z + ")");
    }
}

class Pigeon extends Bird {
    @Override
    boolean flyable(int z) {
        return z < 10000;
    }
}

class Peacock extends Bird {
    @Override
    boolean flyable(int z) {
        return false;
    }
}

public class Main {
    public static void main(String[] args) {
        Bird pigeon = new Pigeon();
        Bird peacock = new Peacock();
        System.out.println("-- 비둘기 --");
        pigeon.fly(1, 1, 3);
        System.out.println("-- 공작새 --");
        peacock.fly(1, 1, 3);
        System.out.println("-- 비둘기 --");
        pigeon.fly(3, 3, 30000);
    }
}


👉 인터페이스 interface : 규격   / 골격제작

  • 인터페이스를 구현한 객체들에 대한 동일한 동작을 보장하기 위해 사용

# 구현하려는 객체의 동작의 명세

# 다중 상속 가능

# implements를 이용하여 구현

# 메소드 시그니처(이름, 파라미터, 리턴 타입)에 대한 선언만 가능

# 생성자와 일반변수 모두 가질 수 없다.


-1) 키워드 : interface  //클래스 대신 사용
키워드 사용해서 클래스를 선언하듯이 인터페이스를 선언
-2) 인터페이스 멤버는 추상메서드와 상수만으로 구성된다.

interface Phone {
public static final 타입 변수명;      //상수
public abstract 리턴타입 메서드명();  //추상 메서드

}

interface Phone {
public static final int BUTTONS = 20;   int BUTTONS = 20;
public abstract void sendCall(); void senCall();
public abstrcat void receiveCall(); receiveCall();
}

* 인터페이스 멤버는 어디서라도 접근 가능하게 모두 public으로 만듬

-3) 모든 메서드는 public abstract 이며 생략 가능하다. 

-4) 상수는 public static final 타입이며 생략 가능하다.

-5) 인터페이스는 객체 생성 불가!
메서드는 모두 구현안된 추상메서드이므로 미완성/불완전해 객체 생성 불가능

Phone p = new Phone(); ----> X

-6) 인터페이스 타입의 변수 선안만은 가능 

Phone p; ---> O

-7) 인터페이스 상속
인터페이스는 다른 인터페이스를 상속 받을 수 있다.
인터페이스는 규격과 같은 것으로, 상속을 통해
기존 인터페이스에 새로운 규격을 추가한 새로운 인터페이스를 만들 수 있다.
extends 키워드 사용

interface Mobile extends Phone {
void sendSMS();    // 상수, 추상메서드
void receiveSMS();     규격추가 
}

### 인터페이스는 다중 상속 허용 ###  (구현이 안되니 충돌날일이 없으니깐)
interface DualcameraPhone extends Mobile, Camera {
void makeVideo();
}

-8) 인터페이스 구현
인터페이스의 추상 메서드를 모두 구현한 클래스를 작성하는 것
키워드 : implements

class Iphone Implementes Mobile{
// 추상메서드 모두 구현
public void senCall(){.....}
public void receiveCall(){.....}
public void sendSMS(){...}
public voiud receiveSMS(){...}
//추가적으로 일반 메서드 , 변수선언
public int doubleFingerTouch(){...}



* 추상메서드중 하나라도 구현안하면 에러!!
  키워드 implements는 객체생성가능
                   Mobile m = new Iphone();

-9) 인터페이스의 목적
-10) 인터페이스의 다중 구현
클래스는 하나 이상의 인터페이스 구현 가능.,
class Iphone Implementes Mobile, Camera,

 

interface Bird {
    void fly(int x, int y, int z);
}

class Pigeon implements Bird{
    private int x,y,z;

    @Override
    public void fly(int x, int y, int z) {
        printLocation();
        System.out.println("날아갑니다.");
        this.x = x;
        this.y = y;
        this.z = z;
        printLocation();
    }
    public void printLocation() {
        System.out.println("현재 위치 (" + x + ", " + y + ", " + z + ")");
    }
}

public class Main {

    public static void main(String[] args) {
        Bird bird = new Pigeon();
        bird.fly(1, 2, 3);
//        bird.printLocation(); // compile error
    }
}

🙋‍♂️ 소감 : 

객체지향 개념을 처음 들었을때는 너무 어려웠는데, 확실히 처음 들었을때보다는 확실히 더 와닿는 부분이 많았다.앞으로 3일동안 오전 라이브강의 내용에 집중해서,다음 프로젝트에는 모르고 쓰는것이 아닌 개념적인 부분을 확실히 이해하고 사용해야겠다.

😈 아는 내용이라고 그냥 넘어가지 않기! 😈

'❤️‍🔥TIL (Today I Learned)' 카테고리의 다른 글

[TIL] 2022-11-21(16day)  (0) 2022.11.21
[TIL] 2022-11-18(15day)  (0) 2022.11.18
[TIL] 2022-11-16(13day)  (0) 2022.11.16
[TIL] 2022-11-15(12day)  (0) 2022.11.15
[TIL] 2022-11-14(11day)  (0) 2022.11.14

댓글