• C언어 : 절차지향
  • 현실세계를 컴퓨터에 그대로 구현하고자 하여 만든 것이 객체지향이다.
  • C++, Java, Python : 객체지향

※ chap4

객체지향

기초

  • 객체: object
    <미사일을 만들자!>
    - 필요 정보: 무게, 길이, 속도,...
    - 필요 x 정보: 색상(뭣이 중한디..)
    - 필요 기능: 폭발
  • 필요 값을 뽑아내는 것: 객체 모델링
    <미사일 = 객체, 객체 모델링 후>
    - 무게 100kg, 길이 2m ... : 변수
    - 폭발 펑 기능 ... : 메서드
  • 객체는 변수(필드, 상태)와 메서드(동작)를 포함한다.
  • 객체 = class
  • class가 가진 변수 = 멤버변수(필드)
  • class가 가진 메서드 = 멤버메서드(함수)

ex) 전구
상태 = 필드 = 변수 : 켜짐(on), 꺼짐(off)
동작 = 메서드 : 켜다(turnOn()), 끄다(turnOff())

  • 현실 세계를 객체 단위로 프로그래밍한다.

객체와 클래스

  • class: 객체의 설계도 ex)붕어빵틀
  • 설계도를 이용해 객체를 만들어가는 과정: 인스턴스화 ex)틀에 붕어빵을 찍어내는 과정
  • 설계도를 이용해 만든 것: 객체 = 인스턴스 ex)붕어빵
  • 같은 설계도를 사용해도 넣는 재료에 따라 객체(결과)가 달라질 수 있다. ex) 팥붕, 슈붕..
  • 필드 = 멤버변수 = 상태 : 속성(값)
  • 메서드 - 멤버함수 = 동작 : 기능

★객체지향의 특징

  • 3가지: 면접 질문

1. 캡슐화 = 정보은닉

  • 실제 구현 내용의 외부에 감추는 것
    : 캡슐화 = 정보은닉
    -> 캡슐 안에 내용물이 보이지 않음. 모름.
    ex)우리 가게의 비밀 레시피!!
    -> 붕어빵 class를 어디까지 이용할 수 있는지 설정하는 것은 제작자 마음이다.
    ex) 붕어빵 틀만 빌려주기, 재료 공개, 레시피 전체 공개

2. 상속

  • 부모(상위클래스)에게 받은 건물(기능,필드)은 자식(하위클래스)이 마음대로 사용할 수 있다.

    	- animal 클래스: 목소리, 다리 개수, 눈..
    	- 독수리 클래스: 날개
    	- 물고기 클래스: 아가미, 비늘

-> 상위클래스: 공통 사항
-> 하위클래스: 상세 특징
-> 자식이 가진것이 많다.(부모는 자식에게 주지만, 자식은 부모에게 주지 않는다.)

※ chap4 - oop(object oriented programming: 객체 지향)

3. 다형성

  • move 메서드 하나로 각 객체들의 움직임(결과)이 fly, run, swim으로 달라짐

  • 상속과 다형성의 장점: 코드 재사용성을 높이고 유지 보수 시간을 최소화환다, 가독성이 높다.

클래스 선언과 객체 생성

추상화

  • 추상화: 객체 모델링 기법
  • 현실 세계의 객체에서 불필요한 속성을 제거하고 중요한 정보만 클래스로 표현

클래스 선언

접근지정자 class 클래스명 {
	자료형 변수명 = 값;	//필드
    자료형 메서드명 {
    	기능 }		   //메서드
 }

  • 하나의 class만 public 선언이 가능하다.
    ex) Car class 생성

객체 생성

  • 인스턴스화

    ex) Car myCar = new Car();
    : 위에서 만든 Car 클래스를 이용한 myCar 객체(인스턴스)를 생성.
    : new를 통해 호출한 Car()는 생성자이다.

기초/참조 타입


: Ball(자료형)을 담을 myBall(변수명)에 새로운 정보(new Ball())을 담을거야!
1. 공은 담을거야: 자료형 = Ball
2. 내 공의 이름은? : 변수명 = myBall
3. 새로운 공의 정보를 담아야지! : new Ball()
4. 어디에? 내 공에! > 내 공(myBall)에 공의 정보(new Ball())를 담는다. : =

  1. 객체 생성: '핸드폰'이라는 객체를 만들자. Class Phone
  2. 추상화(모델링)
    2-1. 어떤 핸드폰이든 모델명, 가격 정보가 필요하지! { String model; int value;
    2-2. 기능을 넣자! print(){syso} }
  3. '핸드폰' 객체를 이용할 다른 객체(인스턴스) 생성: myPhone
  4. 내 핸드폰에 정보 넣어: model = "S8", value = 100
  5. 내 핸드폰 정보 한번에 출력하자!: Phone 클래스의 print기능 이용 > myPhone.print();

문제

  1. x
  1. 캡슐화(정보은닉), 상속, 다형성
  1. class
  1. 필드(멤버변수, 속성), 메서드(멤버함수, 동작)

클래스의 구성요소와 멤버 접근

클래스 구성 요소

생성자

  • 생성자: 객체를 만들어주는 것.
    new연산자로 객체를 생성할 때 객체의 초기화 담당
    : Car 클래스의 color 변수 기본값 = "검정"

  • 자바가 만들어주는 기본생성자가 있다.
    : 컴파일러가 자동으로 만들어주는 것
    Car () { }

필드와 지역변수

  • 자동 초기화
  • int = 0
  • double = 0.0
  • boolean = false
  • main에 없고 특정 구역에만 존재하는 변수 = 지역변수

    ex)Car.speed
  • 객체(인스턴스)가 가진 변수 : 인스턴스 변수

문제

  1. 3
    :지역변수 기본값 없어 초기화 필수다.
    :필드(멤버변수,class가 가진 변수)는 기본값이
    있다. int = 0
    :지역 변수는 선언된 장소에서만 사용 가능하다.
  1. 생성자(Constructor)
  1. Circle c = new Circle();
    syso(c.radius) // 10

접근자와 설정자

  • 접근자 getter: 은행원 ex) 조건 확인 후 10만원을 가져다 줌
  • 설정자 setter: 나 ex) 10만원 줘! > 금고에서 출금하여 잔액 설정

  • 캡슐화 private으로 변수 접근을 막을 경우 get/set으로만 접근 가능하다.
    -> 마우스 오른쪽 -> Source -> generate getter and setter

생성자

의미와 선언

  • 생성자는 만드는 용도이므로 반환 타입 없다.
    -> 객체 생성(인스턴스화) 용도
  • 기본 생성자는 클래스명과 동일해야하며, 반환 타입은 없다.

기본생성자


class안에 생성자를 따로 만들지 않으면 기본생성자가 있다.
기본생성자: 클래스명()
기본생성자가 아닌 다른 생성자를 만들면 컴파일러가 기본생성자를 만들어주지 않는다.
-> 추가 생성자를 만들었을 시, 반드시 기본생성자를 함께 만들어줘야 기본생성자 사용이 가능하다.

생성자 생성

  • 대부분 외부에서 사용하겨 만드는 것이므로 접근지정자 public 선언

문제

  1. x
    :class를 이용해 객체를 생성하도록 해주는 것.
    :생성자의 반환 타입은 없다.
  1. x
    : 기본생성자는 컴파일러가 만들어준다.
  1. o
  1. x
    : 반드시x. 기본은 public으로 선언하나 private도 가능.
  1. 접근자(getter), 설정자(setter)
    : 캡슐화(public > private)하면 외부에서 사용 가능하도록, 접근하고(get) 값을 바꿔줄(set) 것들이 필요하다.

this

  • class의 필드에 setRadius의 매개변수를 넣겠다!
    this.side : class의 사이드
    = side :

연속 호출

인스턴스 생성과 힙 메모리

힙 메모리

  • 스택 = 동적 메모리
    : 함수가 끝날때까지 살아있다.
    ex) gildong, dully
  • 힙 = 동적 메모리
    : 가비지컬렉터가 돌아다니며 일정 시간 이상 사용하지 않는 메모리를 주기적으로 수거하여 정리한다.
    ex) gidong.name, gildong.studentID, 둘리.name, 둘리.studentID,...
    -> 인스턴스 변수까지 스택에 쌓으면 메모리 차지가 너무 많아지고, 인스턴스 변수는 해당 인스턴스를 사용할 때만 필요한 정보이므로 스택에 쌓지 않는다. main의 gildong이를 스택에 쌓으면 -> gildong이의 name, studentID, adress 등의 인스턴수 변수는 힙에 저장된다.

정적 멤버

  • 함수가 끝날때까지 살아있어야 하는 정보
  • static을 붙여 만든다.
  • stack에 고정되어 끝까지 살아있으므로 모든 인스턴스가 공유하는 필드가 된다.
  • (cf)
    -public : 접근지정자. 공공제. 아무나.
    -static : 모든 객체가 공유하는 변수 -> class객체의 값을 모든 인스턴스 객체가 공유하므로 길동이 인스턴스가 class객체의 studentID=7로 바꾸면 둘리 인스턴스의 studentID=7이 된다.
    -> 참조하기 때문에.

-> 모든 객체의 정보가 달라야한다면 static을 사용하면 안된다.

ex) 학번, 카드번호

-> 공유해서 사용해야 하는 값을 가진 변수에 static을 사용한다.
ex) 학번을 생성하는 방법, 카드번호생성방식..

  • 정적 메서드 유의사항
    • static은 데이터영역에 쌓이고, 인스턴스 변수는 필요할때만 사용하므로 heqp영역에 쌓이다.
    • static이 인스턴스 변수/메서드를 사용하려면 인스턴스 변수/메서드도 데이터영역에 쌓여야한다.
    • static은 공유 자료이기 때문에 네것,내것이 없다 = this 사용 불가.

변수

  • 스택: main이 실행될때 main의 함수,변수가 저장된다.
  • 데이터 영역: 컴파일러가 프로그램을 시작한는 순간 상수(fianl), 고정(static)부분을 저장하는 메모리 공간으로 제일 먼저 실행되어 제일 마지막까지 살아있는다.

-> 프로그램 시작하자마자 main이 실행되므로 스택과 데이터영역의 큰 차이는 x

응용

싱글톤 패턴

  • 객체(붕어빵)를 하나만 만들어야 하는 경우
  • 생성자를 외부에서 못 쓰게 숨긴다.
  • private 선언

객체간의 협렵

정리

  • 객체(object): 현실에 있는 것을 프로그램 안에서 만들어낸 것. 인스턴스

    • class: 객체를 만들기 위한 설계도
      -class가 가진 것들: 속성과 동작
      -멤버변수(필드), 멤버함수(메서드)
    • 클래스를 이용해서 객체 생성 : 인스턴스화
  • 객체지향 프로그램 : 캡슐화(정보은닉), 상속, 다형성

    • 추상화: 객체를 만들기 위한 class 생성을 위해 특징을 뽑아내는 것
      -클래스를 만들기 위한 모델링 기법

문제

  1. 4
    : 필드는 자동초기화된다.
    : 생성자는 객체 생성을 위해 new 다음에 쓰는 것. 기본생성자 자동으로 만들어준다. 생성자이름은 클래스명과 똑같아야 한다.
    public 클래스명() { }
    : ★new연산자로 객체를 생성할 때 객체의 초기화 담당 = 기본연산자 사용시 객체의 필드를 초기화한다.
    :변수를 먼저 쓰는 것은 약속일 뿐, 법칙은 아니다.
  1. 2
  1. x
    :하나의 설계도로 여러 붕어빵 만들 수 있다.
  1. o
    :정적 = static > 모든 애들이 공유
    :String 클래스를 new를 쓰지 않고 사용한다!
    : 결국 문제에서 '객체를 생성하지 않고도' 라는 말은, '생성자 사용하지 않고' 라는 말이다.
  1. x
    : Q) 내(ShowError) 안에서 나(new ShowError)를 만들 수 있을까?
    -> 있다. class안에서 main안에 class 사용 가능하다.
  1. 다형성
  1. Util u = new Util();
    : 생성자를 사용해야 Util 클래스의 기능을 사용할 수 있다.
    : 하나의 파일이다
    왜? public은 하나만 사용 가능하다. > 위 파일명: MathTest.java
    : findPi()는 메서드(생성자는 클래스명과 같아야한다. 아니니까 생성자 아님)

★8. 3, 1
Q) static 알아? 생성자 호출하면 초기화되는거 알아?
:sk클래스의 변수 i는 static > sk객체 100개를 만들어도 i값은 1개
:ok클래스는 static X > ok객체 100개 만들면 i값도 100개
:new Sklass(); , new Oklass(); 의미: 생성자 호출하고 저장하지 않고 버림.
(cf) Sklass s = new Sklass(); : 생성자 호출하여 s 변수에 저장.

new Sklass();				//int i = 0(초기화) > i++ > i = 1
new Sklass();				//i = 1 > i++ > i = 2
Sklass() s = new Sklass();	//i = 2 > i++ > i = 3

new Oklass();				//int i = 0(초기화) > i++ > i = 1
new Oklass();				//int i = 0(초기화) > i++ > i = 1
Oklass o = new Oklass();	//int i = 0(초기화) > i++ > i = 1

s.i = 3
o.i = 1

  1. this("no name")이 syso("no argument") 위로 올라가야 한다.
    : this() 자기자신의 메소드를 호출. super()와 함께 항상 생성자의 첫 행에 존재해야 한다.

  1. public static void show()
    : static 선언 > 프로그램 실행되기 전에 데이터영역에 저장
    : static 없으면 show(); 함수 호출해도 찾지 못하므로 오류.
    : show 함수를 먼저 쓰고 호출하는 식으로 순서를 바꿔도 똑같이 오류.
profile
zza

0개의 댓글