[WIL 23.01.22] OO.. (항해 1주차를 마무리 하며..)

이승렬·2023년 1월 22일
0

항해99

목록 보기
13/34
post-thumbnail

오늘은 항해 1주차가 지나는 날이다...
사실상 1월 3일부터 시작을해서 2주일차 이긴 하지만,
어쨌든

제목에서 알 수 있듯이 오늘의 WIL은 바로 OO 이다.
이응이응이 아니라, 객체지향을 말하는 Oriented Object 이다..

오늘은 그래서 이번주차에 배웠던, 그리고 지금까지 공부를 했던 객체지향개념들을 정리해 보겠따.

일단 기준은 "자바의 정석" 기준이므로 이에 맞춰서 적어보겠다..

Q1. 객체지향언어가 뭔데..?

A.

  • 현재, 빠른 프로그래밍 시장 변화에 대한 해결책으로 객체 지향 언어를 도입했다.
    (내가 옛날에 배웠던 C와 같은 것은 '절차적 언어')

그래서 왜 쓰는데..?

  1. 코드의 재사용성이 높다.
  2. 유지보수가 용이하다.
  3. 중복된 코드를 제거할 수 있다.

다음 3가지의 큰 이유를 들 수 있다.

Q2. 객체지향의 핵심적인 개념이 뭔데..?

A.

다음 4가지가 객체지향의 핵심적인 내용이다.
이는 뒤로 갈 수록 확실하게 나올 듯 하다.

  • 캡슐화
  • 상속
  • 추상화
  • 다형성

" 객체지향 '개념' 을 일단 먼저 외우고 익숙해져야 한다고 강의에서 이야기를 했다.."

Q3. '클래스' 와 '객체' 가 뭘까..?

A.

다음과 같이 일단 외우면 나중에 비유를 생각하면서 개념이 잘 잡힐 것 같다.

클래스 == 제품의 설계도
객체 == 제품

정확하게 다시 보면 다음과 같다.

클래스

  • 객체를 '정의' 해 놓은 것
  • 객체를 생성하기 위해 필요하다.

객체

  • 실제로 존재하는 것, 사물 또는 개념 (이것은 객체지향 개념문제이다.)
  • 객체 == 속성 (변수들) 과 기능 (Method) 로 이루어져 있다.

객체가 왜 필요할까?

  • 객체를 사용하기 위해서 필요하다. (당연한 말..?)

객체를 사용하기 위해서???

  • 객체를 사용한다는 것은, 객체 내의 속성과 기능을 사용하는 것이다.

Q4. 클래스에서 조심해야 하는 것들에는 뭐가 있을까..?

  1. 하나의 소스파일에 여러개의 Class 를 작성할 수 있다.
  2. 소스파일의 이름은 Public Class 의 이름과 같아야 한다. (따라서 Public class 는 하나만 쓴다고 생각)
  3. 소스파일과 클래스의 이름은 대소문자를 구별한다!
  4. 하나의 소스파일에는 '하나의 Class' 를 작성하는 것을 권장한다.

Q5. 객체는 어떻게 생성되고 사용하는데..?

  1. Class 를 작성한다. (앞서 말했듯이 클래스는 '설계도' 이다. 설계도를 먼저 작성하자.)
  2. 객체를 생성한다. (또한 객체는 '제품' 이다. 제품을 생성해야 사용할 수 있다.)
  3. 객체 사용 (객체에는 속성 (변수) 와 기능 (method) 가 있다고 하였다. 이를 사용한다.)

참조변수??

객체를 사용하기 위해서 '리모콘' 과 같은 역할을 하는 친구이다.
이때 참조변수를 통해서 객체에게 접근하여 사용할 수 있다.

객체의 의미를 다시정의

이제 객체의 의미를 다시 정의하겠다.

  • 객체는 속성과 기능이 있는친구

여기부터 이제 객체는 "인스턴스 변수 (iv) " 의 집합이라고 정의할 것이다.

또한 객체는 객체마다 별도의 저장공간이 있다. ( 참조변수에는 이 객체의 별도공간의 '주소값' 이 저장되어있다.)

  • 하나의 변수는 객체 하나의 주소만 저장할 수 있지만, 하나의 객체는 여러 변수가 참조될 수 있다.
    (같은 주소값을 할당할 수 있다는 뜻이다.)

Q6. 객체 배열은 뭔데..?

간단하게 이야기를 하면 다음과 같다.

  • 객체 배열 == 참조변수의 배열과 같다. (주소값을 저장하는 참조변수들이 배열로 존재한다!)
  • 이때 참조변수 배열을 생성한다고 했을때 각 참조변수마다 객체가 생성되는 것은 아니다!
    => 즉, 참조변수 생성 (주소값을 할당받을 친구만 생성되는 것)
  • 이때 그래서 직접 객체를 생성해서 주소값을 대입해주어야 한다.

Q7. 클래스도 다시한번 정의해줘

앞에서 클래스는 객체를 위한 "설계도" 라고 정의하였다.
다시한번 정의를 하면 클래스 정의는 다음 3가지로 할 수 있다.

  1. 설계도
  2. 데이터 + 함수
  3. 사용자 정의 타입

1번은 앞에서 이해를 하였고, 그렇다면 2번과 3번은 어떻게 된 것인지 한번 보자

  1. 데이터 + 함수
    일단 이 개념을 이해하려면 '데이터의 확장성' 개념부터 확인해보자
  • 변수(하나의 데이터)
  • 배열(같은 종류의 데이터만 저장)
  • 구조체 (서로 관련된 여러종류의 데이터) (..여기에서 구조체가 나오나..?)
  • 클래스 (구조체 + 함수)
  1. 사용자 정의 타입
  • 원하는 타입을 직접 만들 수 있다.
  • 서로 관련된 데이터를 하나로 묶어서 객체지향적인 코드를 만들 수 있게 되는 것이다.

Q8. 선언 위치에 따라서 변수의 역할이 달라진다고??

앞에서 객체는 iv, 즉 인스턴스 변수들의 묶음이라고 이야기 했다.
그렇다면 이 변수들간의 차이점은 없을까?
물론 있다.
3가지로 나눌 수 있는데 다음과 같다.

  1. 클래스 변수 (iv)
  2. 인스턴스 변수 (cv)
  3. 지역 변수 (lv)

그렇다면 이들이 구분되는 기준은?

이들은 '선언되는 위치'에 따라서, 즉 '영역'에 따라서 달라진다.

  • 클래스 영역: 인스턴스 변수 (iv), 클래스 변수 (cv = iv 앞에 static 붙여짐)
  • 메서드 영역: 지역변수 (생성자, 초기화 블럭 내부에도 적용, + 매개변수도 지역변수임)

이때 클래스 영역에서는 선언문만 가능하다

각각의 생성과 소멸

  • 인스턴스 변수(iv) 는 객체가 생성될 때 만들어진다.
  • 클래스 변수(cv) 는 클래스가 메모리에 올라갈 때 한번만 만들어진다.
  • 지역변수는 변수가 선언되면 생성되서, 메서드가 종료될때 자동으로 소멸한다.

클래스 변수랑 인스턴스 변수랑 Static 만 붙는 차이..?

  • 클래스 변수(cv)

    	1. 객체 생성 없이 언제나 사용이 가능하다.
    1. 객체마다 공통된 값으로 유지할떄 사용.
    2. 사용법은 "클래스이름.변수이름" 으로 사용 <- 클래스 안의 모든 객체가 공유하는 변수라는 것을 알기 위해서.
  • 인스턴스 변수(iv)

    	1. 객체 생성이 무적권 필요하다.즉 인스턴스 객체가 생성이 되었을때 만들어진다.
    1. 객체마다 다르게 유지가 되어야 하는 경우 사용.

Q9. Method 가 뭔데..?

이전에 배웠던 언어들에서 간단하게 "함수" 라고 생각하자.

  • 매서드 : 선언부 (반환타입, method 이름, 매개변수) + 구현부 ( 실행 내역)
  1. 우리가 하는 작업단위 문장들의 묶음이다. (반복되는 작업들을 메서드로 작성하는 것)
  2. 클래스 안에 항상 선언되어 있어야 한다.
  3. 하나의 메서드는 하나의 기능만 해야 한다.

이를 통해서 우리가 얻을 수 있는 점은

  • 중복을 제거 -> 코드가 관리해지기 용이하다. -> 이해하기가 쉬워진다.

Q10. Method 호출과 흐름

Method 호출

  • 메서드를 호출해야지 안에있는 구현부가 수행이 된다.
  • 반환값이 있는 경우에는 대부분 작업결과를 저장할 변수를 만들고 거기에다가 저장한다.
  • 매서드는 클래스 영역에서만 정의 가능하다..

Method 흐름

  1. 클래스 작성 (메서드 작성)
  2. 해당 클래스의 객체 생성
  3. 객체 사용 (메서드 호출)

Q11. return 문?

  • 실행중인 메서드를 종료하고 '호출한 곳'으로 돌아감
  • 반환타입이 void 가 아닐때, return 문을 생략할 수 없음! (반환값 없어도 그냥 return) 쓰자.
  • 반환탕비이 void가 아니고, 메서드내에 조건문이 있을때, "해당 조건의 모든 경우"에 return 문이 존재해야 한다.

Q12. 호출 스텍?

메서드 수행할때 필요한 메모리가 제공되는 공간이다.

stack 개념은 다음과 같다.

stack

  • 밑이 막힌 상자라고 생각하면 된다.
  • 밑에서부터 꺼낼 수 없다.
  • 위에서붜 차곡차곡 쌓인다.

stack 의 특징

  • 중간에 넣거나 중간에 있는 것을 꺼낼 수 없다.
  • 메서드가 호출되면 호출 stack 메모리가 할당되고, 종료시에 해제된다.
  • 아래 메서드가 그 위의 메서드를 호출한다
  • 맨위의 메서드만 하나가 실행중이고, 나머지는 대기중이다.

Q13. 기본형 매개변수 // 참조형 매개변수 ??

기본형 매개변수

  • int, float, char, String, byte, boolean, double, long

  • 값을 읽기만 할 수 있고(read only), 변경 불가

참조형 매개변수

  • 기본형 매개변수를 제외한 모든 것들

  • 값을 읽고 수정이 가능하다. (Read & write 가능)

  • 매개변수로 참조형 변수를 전달할 경우 변수가 가리키는 객체의 주소값이 전달된다.

  • 매개변수로 전달된 변수와 같은 객체를 가리키기 때문에 값의 변경이 간능하다.

참조형으로 반환하면...?

항상 반환값으로 객체의 주소값을 전달함을 인지해야 한다.

Q14. 인스턴스 메서드와 스테틱 메서드 차이..?

인스턴스 메서드와 static 메서드의 차이

  • 인스턴스 변수(iv) 사용여부
  • 인스턴스 객체 생성 여부
    -> 이는 static 메서드가 수행될때 객체가 생성되었는지 알 수 없기 때문에 인스턴스 변수와 메서드를 사용할 수 없다.

-인스턴스 메서드를 사용하지 않는 메서드는 static을 붙일 수 있음.

Q15. 오버로딩이 뭐야..?

오버로딩 : 한 클래스 안에 같은 이름의 메서드 여러개 정의

예시를 들면 더 이해가 쉽다. println() 같은 메서드가 오버로딩이다.
안에 매개변수가 int 형, char 형 다양하다.

오버로딩 성립조건 : 중요하니까 꼭 외워두자
1. 메서드 이름이 같아야 한다.
2. 매개변수와 갯수 또는 타입이 달라야 한다.
3. 반환타입은 상관 없다.

참고: method이름은 대부분 동사

자바도 연산자 오버로딩이 구현되어있다

  • 예) '+' 연산자
  1. 부호
  2. 문자열결합
  3. 덧셈

(단, 직접 연산자 오버로딩은 할 수 없다)

Q16. 생성자와 기본생성자

생성자

  • 인스턴스가 생성될 때 호출되는 인스턴스(iv) 초기화 메서드.
  • 생성자 이름은 '클래스 이름'과 같아야 한다.
  • 반환타입은 영향 없음 (void를 붙이지 않음)
  • 생성자를 '오버로딩'하여 매개변수가 다른 생성자 여러 개를 만들 수 있음
  • 클래스에는 반드시 하나 이상의 생성자가 있어야 함
    (한 개도 없는 경우 컴파일러가 기본 생성자를 자동 추가) -> 기본생성자를...
  • 생성자가 하나라도 존재하면 '기본 생성자'가 자동으로 추가되지 않음

기본 생성자

  • 매개변수가 없는 생성자
  • 생성자가 하나도 없으면 자동으로 생성됨.

Q17. 참조변수 this, 생성자 this()

일단 둘이 아예 상관이 없는 친구이다...

생성자 this()

  • 생성자에서 '다른 생성자' 호출할 때 사용한다.
  • 생성자의 첫 줄에서만 사용가능
  • this()를 사용하여 코드의 중복을 제거할 수 있음

참조변수 this

  • 인스턴스 객체 자신을 가리키는 변수
  • 인스턴스 메서드(생성자 포함)에서 사용가능
  • 지역변수와 인스턴스 변수를 구별할 때 사용함
    -> 지역변수와 인스턴스 변수의 이름이 같은 경우 this를 생략할 수 없음
    (이름이 다르면 생략가능하지만, 보통은 같은 경우가 많으니까... (lv 와 iv를 구별..)
  • static 메서드에서는 사용 불가능하다
    -> static 메서드가 사용되는 시점에 객체가 생성되었는지 확신할 수 없기 때문에
    (static 멤버는 객체 생성없이도 사용이 가능하기 때문이다.) 사용 불가능하다.

Q18. 변수의 초기화??

변수의 초기화

  • 지역변수(lv)수동 초기화한다. (성능상의 문제 때문에 무조건 해줘야 한다.)
  • 인스턴스변수(iv)자동 초기화한다. (초기화 해줘야 할 것이 너무 많기에)

이때 변수의 초기화는 3가지 정도로 나눌 수 있다.

  1. 명시적 초기화
  • '=' 와 같이 대입 연산자로 처리한다.
  • 간단 초기화라고 말하기도 한다.

참조형 변수의 초기화

참조형 변수에 들어갈 수 있는 것은 다음 2개와 같다.

  • null 기본값(엄밀히 말하면 초기화가 아니다.)
  • 객체주소

이때 객체주소와 같은 경우는
객체를 만들어 넣어줬을때 초기화 이므로
엄밀히 말하면 명시적 초기화 이다.

  1. 초기화 블럭

2가지의 초기화 블럭이 있지만 첫번째 인스턴스 초기화 블럭은 잘 사용 안한다고 한다.

  • 인스턴스 초기화 블럭({})
  • 클래스 초기화 블럭(static {})
  1. 생성자
  • iv 초기화, 복잡한 초기화 할때 사용한다.

cv, iv 초기화 순서

  • 자동초기화 => 간단초기화 => 복잡초기화

멤버변수 초기화

  • 클래스 변수 초기화 시점 : 클래스가 처음 로딩 될 때 단 한번
  • 인스턴스 변수 초기화 시점 : 인스턴스 생성될 때 마다

마치며..

다음주에는 객체지향 파트 2를 열심히 정리하고 뒷 부분도 마저 정리할 것이다.

profile
Backend_Developer

0개의 댓글