[구디아카데미]DAY16 생성자, 클래스 두개, 인스턴스화(=객체), static

NA YE SOM·2023년 7월 20일
0

*인스턴스는 메모리에 올라간 객체를 뜻하고 클래스 맴베는 static 키워드가 추가된 맴버라는 것을 처음 알게 되었고 다시 한번 복습해야겠다.

-> 파라미터 타입 2개 : BankAccount, long


-> 반환값이 있으면) 반환값을 받아서 처리하는 gg가 있을것임

  • 통장잔액 : 49999원


(ex) 10만원 출금하려고 하면 10만원> 49999 -> 0 반환


-> 동일한 메소드안에서 메소드 호출시) 그냥 이름만(withdrawl) 불러서 호출가능
-> 실제로 출금된 금액이 나옴


-> 출금된 금액이 나오면 금액을 상대계좌로 입금해주겠음

-> 안쪽부터 처리 : 내 통장에서 돈 빼는것 먼저(withdrawl) -> 실제 이체된 금액을 상대계좌로 넣어줌(acc.deposit)

-> 동작하지 않음


연습문제


  1. 필드 - 외부에 공개 안함(private)

  2. Setter

    -> set + 필드이름( 외부로부터 값을 받아와서 파라미터 필요없음 : 파라미터에서 값을 가져와서 필드로 전달)

3.Getter

-> 값을 외부로 반환해줘야해서 "return"을 가지고 있음 (모든 getter는 return 값가짐)

  • getter ,setter 탄생이유 : 필드 private
    -> 직접 접근 불가
    -> getter, setter 통해서 접근


(ex) 9시 + 24시간 후 -> 9시가 나오도록, 33시간 (x)


-> return : 실제로 반환할 값이 있다는건 x -> "메소드 종료를 원함"

(1) 더하기 (2) 24로 나눈 나머지값

-> 시계에서는 1일수 취급 x -> 버리기

-> 24로 나눠서 몫 1: 1일, 나머지 : 9 : 9시간




-> 60초는 1분으로 바꿔서 저장시키기


-> addMinute이 분을 증가시키기 맡기기


-> addHour가 시간을 증가시킴


-> 직접 로직 짜지 말고 맡기기



60 x 60 -> 1분1초


-> 3시간 2분 1초후


1시간 정보 -> hour에 넣기 (직접 증가 x : addHour(1))

-> addHour(1) : 1시간 가져가도록
-> minute을 60으로 나눈 몫 -> addHour에게 전달


-> -값 넘어오면 하지 않겠다



-> 몫 61분 증가 -> addMinute 메소드에 넘겨서 증가


-> second 자체의 값 60으로 나누기

this

-이유: 클래스내에 변수가 많아지는 것을 피하기 위해서
this() : 같은 클래스의 다른 생성자를 호출할 때 사용, 생성자 내부에서만 사용할 수 있음, this() 메서드에 인수를 전달하면, 다른 생성자 중에서 메서드가 일치하는 다른 생성자를 찾아서 호출한다.


ex04_field

-> 메소드 체이닝(method chaining) : 메소드를 계속해서 부르고 부르는 것(java script, j query 등)
-> 체인이 연속적으로 많이 사용되는 것 : java script(자바 스크립트)


p 태그 : 문단을 나타내는 것
맨끝

p 태그 : br 태그 없어도 자동으로 "줄바꿈" 됨




-> 객체가 어디에 있는지 주소만 저장함


-> 16진수 참조값 주소( f까지 사용 가능 : 6f에 저장된 calculator), 메모리 어디 저장된 객체

-> this

Calculator 내부로 와야 this 확인 가능

모든 객체는 참조값을 가지고 있음( 기본타입 or 참조타입 )

<결론>

**this는 class 안에서만 쓸 수 있음(ChainCalcultor 안에서는 this 라고 부름, ㅡMainWrapper 안에서는 myCalc라고 부름)(클래스 내부에서만 this 쓸 수 있음)

**

-> (ChainCalculator) 왼쪽에서 this 나오면 myCalc라고 생각하기!

this = myCalc


-> 연속해서 부르고 싶을때


-> 체이닝이 없으면 오류 안남



-> addition 실행후 myCalc반환해줘야 함


-> 그뒤에 붙이기(한번에 하나씩하기)

결론 : addition method실행결과는 myCalc여야함(myCalc반환함)


-> 반환타입 : void -> ChainCalcultor


-> 왼쪽에서는this라고 부르기로 함

-> 원래 따로 부르던것을 this 활용해서 부르기
-> 자바 스크립트는 chaining이미 다 만들어져 있음


-> setter에서 this 용법 설명


-> 받아오는것이 value래서 value라고 적기!
(parma이라고 적으면 코드만 봐서 의미전달이 안됨)

-> 필드 value 파란색,
value = value 는 파라미터 색


myCalc. value로 쓰자
-> this.value


this. value - 필드

필드와 파라미터의 이름이 동일하더라도 구분할 수 있는것 : this 활용
-> 필드에다가 this붙이기!


ex06_this MainWrapper


start는 구현되어있는 중 하나임 -> on으로 변경


-> value 초기값 찍어주는 것 : on


-> 지우기
-> println => print로 변경

마지막 결과는 2.5
-> chaining 필요 x

생성자 : 객체를 만들때 호출하는 메소드

만들지 않아도 된다(만들면 우리가만든것 사용)

-> 객체 생성만 했음


->"객체생성하는 용도의 메소드" = 생성자(생성하는 메소드)
-> 메소드 Calculator호출(만든적이없는데)
-> 기본 안만들어도됨
-> class는 무조건 객체로 만들어야 함
-> 객체를 만들어주는 메소드는 우리가 만들지 않으면 자바가 만듦
-> 우리가 만들면 우리가 만든 것을 씀


static, method



-> 반환은 메소드 오버로딩에 영향을 미치는 것이 아니었음

-> 생성하고 싶은 것들을 여러개 만들 수 있다.


-> 기본 생성자(디폴트 생성자) 뜻임.

디폴트 생성자(default constructor)


-> 사실상 이름만 있는 메소드

필드값 바꾸기 위해서 setter 부름


-> setter 반환타입 : void
-> set 다음에


-> model값을 밖으로 빼는 것만 수행 - return값만 !
getter만들때 this 사용하지 않는다(사용할 필요가 없어서)(파라미터가 없으니 구분할 필요가 없음)


-> 메소드 접근 권한 public

메소드 이름 = class 이름 computer

-> void 개념 자체가 없음 -> 지우기

  • 자바에게 맡길거면 : 단 한개도 생성자 만들지 않아야 함


-> 파라미터가 달라야 함


-> 모델이름 주기


-> string 인수 1개 있음


-> 인수가 string 이면 파라미터도 string으로 받기

생성자도 메소드, 공개된 메소드 : public


setter 부르지 않아도 macbook 잘 저장되었음

-> 하나는 인수 x, 하나는 인수가 있음
-> 객체생성방법
-> 생성자 2개 만들어야 함
-> 객체 생성하는 방법마다 하나씩 만들어야함

기본 필드값 가진 객체를 만들자
-> 아무값이 없으니 값 채우기 위해서
-> setter 호출

필드값을 채울 목적으로
getter 호출(저장된 데이터)

생성자와 setter하는 일이 같음
(생성할때, setter까지 같이 해주고 싶으면 생성자 만들어서 같이 씀)
-> 헷갈리면 안만들어도 자바가 알아서 ~

-> 이왕 만들려면 이건 만들 필요없음



-> 생성자 만들면 setter를 호출하지 않아도 된다

--
2번째 클래스가 1번째 클래스를 필드로 가져감



-> 총에 들어가 있는 총알(bullet)
->

-> 상수로 줄때는 : 대문자, 값(50)이 있어야함


: 객체 생성시 총알이 bullet으로 들어가야함

-> 메소드 이름(Gun) = 클래스 이름(Gun)


-> this. bullet (필드)
-> bullet(파라미터, 받아온 총알)

-> 최대 50개 들어오기로 했는데 100개 들어왔을시)

-> 50개는 버리고

if 쓰지 않고 조건연산자 쓰기

50? 보다 크면 50이라 쓰기
50 안넘으면 들어온 총알만 쓰기


-> 아니면 :(콜론)으로 연결


-> 장전할 총알이 몇개인지 받아오기
(총알이 들어있는 상태에서 장전가능)

-> 필드값 (총에 들어있는 총알)


-> 받아온 총알 더해주기
-> 50발 제한을 넘길 수도 있음

-> 100발을 넘기면 메시지 나오고 장전을 하지 말기

  • 안되는 기준은 꼭 50이 넘었을때 안되는건 아님


-> 원래있던 총알에 더해서 50이 넘으면 안됨

-2주안에 자바 진도 빼기
-1주동안 다른거 하기(공공API 자바로 쓰는것, DB로 연결해서 하는것)


-> 실제로 더한건 아니라, 더해보는척


-> this.bullet 이랑 똑같은것 (this는 구분할 필요가 있을때만 붙임)


-> 필드가 Gun임


-> 군인만들때 총알 30개 전달
(총알 30개 가진 군인)]


-> 50번(0~49번까지) 돌아감


1. Soldier
2. reload
3. shoot
메소드 3개 만들기


-> 객체가 선언만 된 것

-> 총알을 받아오는 생성자 필요

반환타입 개념 x 작성 x

총알을 gun에다가 넣는 것
선언만 되어있음

-> SoIDLER에서 생성자 호출


-> 군인이 객체로 만들어질때 총도 자동으로 만들어짐

soldier의 reload는 gun의 reload를 재호출
-> gun의 reload 실행됨


-> 최종호출
soldier는 의미 구현되어있는걸 불러서 구현

★ class 3개를 넘기지 않음


생성자로 전달되는 인수 gun


-> 받아온 값을 필드값으로 전달해오기


객체생성완료? new Gun, new Soldier
(총 1개, 군인 1개)


객체생성이 올바르게 잘 진행?
new 위치만 바꿈 (new 한번씩 써서 객체만들고 사용하면 됨)




-> 단순 입출력

4개

그 중 3개가 setter
필드 3개(set 이름 + )


-> 생성자는 안만들어도 됨(default쓸거라서)

--

setter2개
필드 2개 - private


-> titleSong.info 불러주면 끝남(만들어져있는거 가져다 쓰기)

*보충
Class 배열을 가지는 것(지금은 한개 가지고있음)
-> 가수가 노래를 여러곡을 가짐(여러개 저장위해서-> 배열필요)



->
-객체: 개념적인 단어
-기술적 : Calculator를메모리에 객체로 만들기




-> 인스턴스 : 메모리에 올라간 객체
-> 인스턴스화 : 메모리에 올라가는 것

Static : 미리, 하나만 메모리에 올라간다

-모든 필드,메소드 : 인스턴스 멤버 : static 안붙어있는 아이들
-> 인스턴스가 사용한다
객체가 메모리에 로드되면 사용할 수 있다.
-New 를 안하면 사용할 수 없음

  • 메모리 로드 이전에는 사용할 수 없음: 인스턴스가 아니니까

-> 왜 클래스라고 하는지? 객체를 만들기 전, 인스턴스가 생성되기 전(new를 안함)


일반객체들은 new할때 만들어지는데, static붙여진 애들은 new안되도 메모리 올라가서 쓸 수 있음.



-> 3개를 song 메모리에 가지고 있음


-> 실행하는 메모리에는 2개(song, song2) 가 있음
-> 노래마다 다른값(title, genre, playtime 2개 올라감)
-> 인스턴스 갯수만큼 올라감

클래스멤버는 하나만 올라가있음

(ex) 학생 : 인스턴스 멤버로 만듦, 다니고 있는 학원정보를 다 메모리에 올리는게 좋은게 아님 -> 하나만 올림

★ static 만들어지면 하나만 만들어짐
->singleton(싱글톤) pattern만들때 쓸것(객체를 둘이상만들면 안될때 -> 하나만 만들때, new를 못하게 막을때)-데이터베이스 동시접속 막기위해서


-> 인스턴스 없어도 메소드 불를 수 있어야 함

-> 객체를 안만들고 부른 메소드(system.out.println)

-> 경고 메시지 팝업


-> 붙인이유: main이 static이라서(main은 정해진 형식: 바꿀수없음)

static 안부르면 인스턴스화 될때 부를 수 있음(new를 할 때 만들어짐)

-> new MainWrapper를 돌릴때까지 (블록처진 부분은 올라가지 않음)


-> 여럿이 함께쓰는 공유하는 것은 static으로 하면 좋음


-> static 붙으면 PI(기울어져있음)

-> OUT(CLASS를 통해서 불러야함)(기울어져있음)


->(오류) STATIC은 미리 만들어야 하는데,
인스턴스 만들어야 동작하겠다는 것

STATIC 필드 초기화


-> 파이r제곱

★★static 이 붙어있는 애들 : class이름으로 부른다 (new 안붙임!)

static 맴버

Main 호출 : 자바가 함(자바 virtual machine)
-> 호출하려면 메모리에 있음
-> New.MainWrapper 안하고 인스턴스안하고 작동하기 위해서는 "static"밖에 없음


<보충> 문제 중 일부분은 그대로 나옴

profile
개발자 velog

1개의 댓글

comment-user-thumbnail
2023년 7월 20일

좋은 글 감사합니다!

답글 달기