[멋사 TIL] 13기 day5

이은서·2024년 12월 6일
0

멋사

목록 보기
3/11
post-thumbnail

🔄️복습

객체

: 시뮬라 라는 언어가 최초
"우리 세상을 있는 그대로 옮겨보는 거 어때?"
우리 세상에서 보이는 모든 것들을 객체로 옮겨보기

객체 만들 때 TIP!

내 색깔 내가 바꾼다

자기 데이터는 자기가 바꾸는 게 기본

static

Math가 가지고 있는 메소드들도 static, main 메소드도 static : 그래서 new해서 새롭게 만들지 않아도 쓸 수 있는 거임

random

math.random : 근본적으로 나에게 줘서
vs
Random 클래스 : 내부적으로 처리..?
이미 있는 애, util 패키지
이미 있는 애 더 편하게 쓰라고
준 게 util 패키지




자바스크립트: 매개변수 안 써줘도 쓸 수 잇음
배열로 자동으로 받는 게 있다? 가변인자 가변인수
매개변수: 값이 넘어오면 받을 그릇

static

static한 메소드는 인스턴스를 생성하지 않아도 호출할 수 있다.
static한 애들은 그 클래스의 일부라고 완전히 보기에는 어려움이 있음
공간을 미리 차지하고 있음
static하지 않은 메소드들은 생성자를 만들어야 그제서야 메소드가 메모리에 올라오고 사용할 수 있는데,
static한 애들은 객체를 생성하지 않아도 미리 사용할 수 있게 만들어놓음

static은 객체의 속성에 접근 못함

언제 사용하면 좋을까?

각각 값을 가지게 해주고 싶으면 static x

🤔 "미리" 만들어져있다고 하는데 이 "미리"가 언제지?

클래스 변수 VS 인스턴스 변수

메모리가 따로 안 생긴다 static 변수는, 그래서 클래스 변수라고 한다. 인스턴스가 만들어질 때 그 속에 있는 게 아니므로!

package day05;

public class Person {
    String name;
    String address;
    boolean isVip;
    static int cnt = 0;  // 인스턴스화될 때 생성되는 게 아니라 미리 한번만 생성된다. 같이 공유된다.
}
...
package day05;

public class PersonTest {
    public static void main(String[] args) {
        Person p1 = new Person();
        Person p2 = new Person();
        Person p3 = new Person();

        p1.name = "kang";
        p2.name = "kim";
        p3.name = "hong";

        System.out.println(p1.name);
        System.out.println(p2.name);
        System.out.println(p3.name);

        System.out.println(p1.cnt);
        p2.cnt = 10;
        System.out.println(p1.cnt);
        System.out.println();
        System.out.println(p2.cnt);
        System.out.println(p3.cnt);
    }
}


static 정보는 어디에 저장?

~Java 7Java 8~
non-heapheap

클래스 메소드 VS 인스턴스 메소드

  • 인스턴스 별로 다르게 동작해야 한다면 인스턴스 메소드
  • static 메소드는 객체 생성이나 유틸리티 관련에서 사용될 때가 있다.
  • 되도록 인스턴스 메소드를 사용한다.

필드는 초기화 안해도 되는데 메소드 안에 있는 애들은 초기화 안 하면 오류 난다

main 메소드는 왜 static해야 할까?
main 메소드는 jvm이 불러서 사용해야 하는데 static해야지만 jvm이 접근해서 사용할 수 있을 것이다. (이미 메모리에 올라와 있어야 한다.)





캡슐화

관련된 것들을 모아서 가지고 있는 것이 캡슐화
그래서 클래스도 캡슐화

펜의 ~정보~정보~정보가 필요했다고 했을 때 이 정보들을 묶어서 저장해줄 수 있는 클래스! -> 캡슐화
객체지향 할 때는 함수, ~ 다 따로 움직였는데 이제는 하나의 캡슐로 모을 수 있는 것
생각난거: 캔바 "그룹으로 묶기" ㅋㅎㅎ
데이터(필드)와 메서드(동작)를 하나로 묶고, 외부로부터 데이터를 보호하는 개념


좋은 객체는 응집도는 높고 결합도는 낮다.

결합도

객체끼리는 상호작용하기 때문에
한 객체가 두번째 객체를 사용한다고 했을 때
두 번째 객체에서 뭔가가 바뀐다고 했을 때 첫번째 객체에서도 바뀌어야 함
→ 결합도가 높다

응집도

응집도는 객체 안에서, 자기들끼리 응집도가 높은 것

관련된 것끼리의 응집도는 높은 것이 좋지만 결합도가 높게 되는 것은 좋지 않다
결합도를 낮추기 위해 인터페이스, 스프링의 ioc가 쓰임
그래서 사용되는 객체가 교체가 되도 다른 친구는 바꿀 게 하나도 없게 되는 것이 결합도가 낮은 것이고, 이것이 유연성이 높게 되는 것
소프트웨어는 이렇게 만들어져야 한다


좋은 객체란?

좋은 객체란 역할과 책임에 충실하면서 다른 객체와 잘 협력하여 동작하는 객체를 말한다. 반대로 나쁜 객체란 여러가지 역할을 한 가지 객체에게 부여하거나, 이름과는 맞지 않는 속성과 기능을 가지도록 하거나 제대로 동작하지 않는 객체를 말한다. 또한 다른 객체와도 동작이 매끄럽지 않는 객체를 의미한다.

한 객체가 많은 일들을 하는 것이 바람직하지 않다
딱 그 롤에 알맞는 일을 잘 하는 것이 중요
cf. 나중에~~ "단일 책임의 원칙"





다형성

다형성 핵심 용어: 다양한 형태
→ 대표적으로, print메서드 / 상속

메소드

↳메소드 오버로딩(Overloading)

  • 메서드의 이름은 같고 매개변수의 갯수나 타입이 다른 함수를 정의하는 것을 의미한다.
  • 리턴값만을 다르게 갖는 오버로딩은 작성할 수 없다.

매개변수의 개수나 타입이 다르면 됨
리턴값도 달라져도 소용이 없고 매개변수가 달라져야 됨
"리턴값도 달라져도 소용이 없다"
메소드 불러서 쓰는 시점에서는 리턴을 하는 앤지 안 하는 앤지 구분이 안 된다는 뜻.
하지만 매개변수는 갖다 쓸 때 구분이 된다.

cf. print 메서드

// 하나가 아니라 사실 여러개가 구현되어 있음
System.out.println(10); // 정수값을 받은 구현체가 동작
System.out.println("12");
System.out.println('a');

→ 다형성: 메소드 오버로딩으로 구현 되어 있음
api 참고


다 똑같은데 어떻게 요청했냐에 따라 다른 화면이 보이는 것도 다형성 (나중에 웹할 때)

메소드 같은 이름으로 여러개 하면 이점:

"자동차 색상만 보고 싶다던지...더 상세하게 보고 싶다던지"
같은 일을 하는 거니까 사용하기 편할 수 있을 것
cf. print 메소드: 문자열을 출력하는 애~ 정수를 출력하는애~
다 따로라면 api 뒤져가며 걔 이름은 뭐지?
하고 찾아봐야 하지만 다 똑같이 동작할 것을 기대하고 사용할 수 있을 것
이름이 같으니 기능을 사용하기 더 편리
add()라는 메소드: int 2개 받아야 하면 add2() add3()이런 식으로 하면 분명 불편할 것이기에!
"printlnString(), printlnInt(), printlnDouble()..."
그런 프로그램도 있을 수 있지만 이렇게 다형성이 있는 언어를 사용하면 좋다
타입 구분이 어려운 언어가 보통 그렇다
객체를 정의할 때도 이런 오버로딩을 활용해볼 수 있을 것임!





패키지 이름 정하는 규칙

패키지는 보통 도메인 이름을 거꾸로 쓴다.

kr.co.sss.proj1 -- 왜?? 도메인을 이용할까?
중복되지 말라고.
A사, B사, C사, ... 등이 같은 프로젝트 네임을 쓸 수도 있지만 URL은 남의 회사 것을 사용할 일이 없지 않은가.

likelion.net
↳ "net.likelion.bootcamp.backend" 식
"." : 디렉토리가 만들어짐, 그 안에 클래스들 들어감
📁net → 📁likelion → 📁bootcamp → 📁backend → 여기 안에 코드들 만들어질 것!
꼭 있는 url로 만드는 것도 아님, 그렇지만 본질적 이유는 중복되지 말라고.


메모장에 쓰면 package 써줘야 함

public static void main(String[] args) {
	com.carami.exam.Hello h = new com.carami.exam.Hello();

매번 이렇게 패키지 명시해서 쓰기 어려우니까 위에 import하는 거임
근데 다른 패키지에 있는 애 갖다 쓰려고 하면 명시해야 함
클래스는 사실 패키지 이름까지 포함한 게 클래스이름이다 라고 생각하는 게 더 좋을 수 잇다
근데 다 나열해서 쓰기 번거로우므로 import를 써서 코드 짜는 거임
이름이 똑같을 경우 둘 중 하나는 패키지명까지 써야 한다는 거
(마지막 이미지 다시 보고 수정!)

package day05;

public class ClassA {
    public static int fieldA; // 클래스 필드 : 하나만 존재
    public int fieldB; // 인스턴스 필드 : 클래스 생성 전에 접근 불가능
    int fieldC; // default 영역이므로 패키지가 다른 곳에서는 사용불가 : 같은 패키지에서는 사용가능
    private int fieldD;// private 영역은 나 이외에서는 사용 불가
    protected int fieldE; // (헷갈릴 수 있음!) 기본패키지까지 허용되고, 다른 패키지라도 나의 자손은 접근 가능 > 상속 배우면 더 이해 가능
    
    public static void main(String[] args) {
        System.out.println(ClassA.fieldA);
        // System.out.println(ClassB.fieldB); 인스턴스 필드는 인스턴스가 생성되어야만 비로소 접근 가능

        ClassA a = new ClassA();
        System.out.println();
    }
}

"java가 메모리를 어떤식으로 쓰고 있는지"
링크 확인
면접볼때 질문하기도!

0개의 댓글