Chapter 6. 클래스와 객체 6-1 객체지향 프로그래밍 6-2 클래스와 객체(cont.) 6-3 생성자/6-4 메서드/ 6-5 오버로딩

plus :)·2022년 10월 10일
0

6-1 객체지향 프로그래밍(oop)란?

  • 문제 혹은 로직을 객체 단위로 나눠서 작성하는 방법
    • 절차지향 프로그래밍과 반대의 개념이 아님
  • 객체들이 서로 유기적으로 상호작용하는 프로그래밍 이론
    • Java, C# 등이 대표적인 객체지향 프로그래밍 언어

예시) 자동차(객체)= 데이터(바퀴, 핸들, 차체 등)
+ 기능(주행보조기능, 길찾기)

위 두 문장은 접근방식의 치이가 있다.


★ oop의 특징 ★ 캡-추-상-다
1. 캡슐화 : 데이터의 구조와 기능을 하나의 캡슐형태로 만들어
외부에서는 형태를 알 수 없도록 하는 방법
2. 추상화 : 객체의 공통적인 필드와 기능을
하나의 형태로 정의하는 설계 방법

  1. 상속 : 하위 클래스에서는 상속 받은
    상위 클래스의 기능을 사용할 수도 있고,
    하위 클래스 자체에 새로운 기능을 추가할 수 있는 것
  2. 다형성 : 객체가 상속을 통해 기능을 확장하거나 변경하여
    다른 형태로 재구성되는 것 (오버로딩/ 오버라이딩)

**OOP 의 장점
1. 코드 재사용성 증가
2. 생산성 향상
3. 유지보수가 쉬움

**OOP 의 단점
1. 개발 속도가 느림
2. 실행 속도가 느림
3. 코드의 난이도 상승

6-2 클래스와 객체(cont.)

  1. 클래스 정의

    • 객체의 설계도
    • 사용자 정의 타입
    • 데이터와 기능의 결합
  2. 클래스 용도

    • 객체를 생성하는 용도
  3. 객체 정의
    : 클래스의 정의된 내용에 맞춰 메모리에 생성된 형태

  4. 객체 용도
    : 정의한 클래스 내용에 따라 속성과 기능이 다름

    ☆객체와 인스턴스

    Class A ---> instantiation ---> JVM
    private int count; new A()
    private itn getCount(); new B()
    new C()

-인스턴스의 생성과 사용

**참조 타입이기에 배열로 생성할수있다.

** 클래스에 정의된 형태로 사용하기 위해서는
참조변수 뒤에 점.을 찍고,
함수이름을 호출해주면 된다.

클래스 변수와 인스턴스 변수

-이제 클래스를 정의할때 사용할 수 있는 변수의 종류는..
총 3가지 이다..

-클래스변수/ 인스턴스변수/지역변수 이다.

  1. 클래스변수는 클래스 내부에 위치하고 static 키워드가 붙는다.
    클래스가 메모리에 로딩될 시점에 생성되기에..
    객체를 생성하지 않고 바로 사용가능하다.
    ★클래스객체는 모든 객체가 값을 공유할때 사용해야 한다.
  2. 인스턴스 변수는 클래스 내부에 위치하고, static키워드가 붙지 않는다.
    객체가 생성이 될때 인스턴스변수 공간이 생성되기에
    객체가 생성된 후에 사용할 수 있다.
    인스턴스 변수는 각 객체마다 유지할 값이 필요할 때 사용된다.
  3. 지역변수는 메소드 or 생성자 or 초기화 블럭에 위치한다.
    해당 부분들이 실행될때 생성이 되며..
    블럭에서 벗어나면.. 변수의 메모리의 공간이 변형되게 된다.

6-3 생성자

-생성자(constructor)란?
1. new키워드로 인스턴스를 생성할 때, 제일 먼저 실행되는 메소드

  • 클래스 이름과 동일한 이름이어야 함
  • 반환 값은 없지만 void형으로 적어주면 안됨
  • 기본 생성자 외에 여러 개의 생성자를 가질 수 있음
  • 기본 생성자
    : 매개변수가 없고,
    어떤 실행문도 없는 생성자 = 빈메소드 형태이다.
  1. 모든 클래스에는 반드시 하나 이상의 생성자가 정의
  2. Java complier가 어떤 생성자도 없을 때 기본적으로 추가해줌
  3. 어떤 생성자가 있으면, complier가 기본 생성자는 별도로 추가하지 않음

모든 클래스는 하나 이상의 클래스가 정의 되어야 하는데..
만약 생성자를 명시하지 않으면.. 컴파일러가 자동으로 추가를 해준다.

생성자가 하나라도 정의되어 있음..
컴파일러가 기본 생성자를 별도로 추가하지 않는다.

★ 매개변수가 있는 생성자
: 메서드처럼 매개변수를 인자로 받아 인스턴스 초기화에
값을 사용할 수 있는 생성자이다

  • 인스턴스를 기본생성자로 생성 후,
    set메소드를 호출해주는 것보다 간결한 코드를 작성할 수 있다.
  • 아래 그림 캡쳐

    ★ User클래스를 정의하고,
    그 안에는 매개변수가 2개인 유저생성자를 정의 했다. 각각 매개변수를 넘겨 받아서..
    인스턴스변수의 값으로 초기화 하는 것을 확인 할 수 있다. ============

★ this()와 this 키워드

this()

  • 같은 클래스 내부의 다른 생성자를 호출할 때 사용

  • 생성자 첫 문장에서만 가능

    this

  • 인스턴스 자신을 가르키는 참조변수

  • 인스턴스의 주소가 저장, 숨겨진 채로 존재

  • static 메서드에서는 사용 불가


    <바로 위 그림 코드로 한번 확인 설명>
    생성자 중에서 매개변수가 유저네임만 받는 생성자에서..
    매개변수가 2개 있는 생성자를 호출하는 것을 확인할수있다.
    이때 this메서드를 사용해서.. 다른 생성자를 호출한다.

매개변수가 2개인 메서드는
this 키워드를 호출해서..
변수를 선언하고 있다.
★이뜻은 객체가 생성이 될때..
객체 자기 자신을 가리키고,

-자기 자신이 인스턴스변수이다.
유저 네임과 유저 아이디를 초기화 하라는 뜻이다.
객체가 생성될때 자기자신을 가리키고,
자기 자신의 인스턴스 변수
유저네임과 유저아이디를 초기화 하라는 뜻이다..

6-4 메서드

**메소드(Method)란?
어떤 특정한 기능을 수행하기 위한 명령문들의 집합체

**구성은 크게 두부분으로 나뉨

  • 선언부

  • 구현부

    **메소드의 구성요소

    -선언부
    : 접근제어자, static/final keyword,
    메소드 이름, 매개변수 선언, 반환타입으로 구성


-구현부
: 지역변수, 수행될 실행문, return문으로 구성
: void형일 경우


★ 매개변수의 종류
: 메서드에서 넘겨받는 매개변수의 종류는 크게 두가지
-기본형 매개변수: 기본 데이터형으로 넘겨 받는 매개변수, 읽기만 가능
-참조형 매개변수: 인스턴스의 주소를 넘겨 받는 매개변수, 읽고 변경 가능

-참조형매개변수 = 객체형매개변수
-참조변수 = 객체변수

★반환 값의 종류
: 메서드 종료 시, return이 되는 대상에 따라 나뉨
-기본형 반환 값: 기본형을 반환하는 것은 기본형 데이터를 반환
-참조형 반환 값: 참조형을 반환한다는 뜻은 객체의 주소를 반환

강사님曰) 지금까지 메서드 구성에 대해서 살펴봤고,
이제는 메서드가 호출 될때 동작되는 것을 알아보자

JVM=자바버추얼머신
JVM은 여러 모듈로 구성되어 있고,
어플리케이션이 동작할때 사용될때 메모리 공간이
롱타임데이터 에어리어입니다..
롱타임데이터 에어리어는 다시 5개 영역으로 나눌 수 있다.

===

★호출스택

-스택에서 메소드의 작업에 필요한 메모리 공간 제공
-메소드의 작업에 필요한 메모리 공간 제공
✔ 메소드가 작업을 수행하는 동안 지역변수들과
연산의 중간결과 등을 저장하는데 사용.
✔ 메소드가 작업을 마치면 할당되었던 메모리는 반환
✔ 호출 스택 제일 상위에 위치하는 메소드가 현재 실행 중인 메소드,
나머지는 대기
✔ 객체를 생성하지 않고 호출하기 위해서는 static keyword

<호출스택을 코드와 함께 살펴보자>

★ static/인스턴스 메서드
*static메서드

  • 객체 생성 없이 호출할 수 있는 메서드(Class이름.method이름())
  • 메서드 내 인스턴스 변수 사용 불가*인스턴스 메서드
  • 객체 생성 후, 호출할 수 있는 메서드(참조변수.method이름())
  • 메서드 내 인스턴스 변수 사용 가능

6-5 오버로딩

강사님曰)

: 오버로딩(overloading)란?
한 클래스에 내부에 같은 메소드 이름으로 서로 다른
여러 메소드를 정의하는 것을 말한다.

★메소드의 매개변수 메소드의 시그니처가 달라야 한다.
★반환타입은 오버로딩과 관련이 없다.

  • 메소드의 매개변수의 수 혹은 타입이 달라야 함

  • 반환 타입은 상관 없음

    아래 그림파일처럼..
    하나의 메소드

  • 오버로딩과 가변인자
    : 메소드의 매개변수를 동적으로 지정할 수 있는 기능(>=JDK1.5)
    -가변인자의 선언: 데이터타입.. 변수명
    -가변인자는 메소드 매개변수의 마지막에 선언해줘야 함
    -가변인자를 선언한 메서드는 되도록 오버로딩 하지 않는 것이 좋음

6-6 과제


-컨디션 condition
1.(몸과 마음의 상태) (physical/mental)
2.(사물의 조건·상태) condition

6-7 과제해설

강사님曰) 소스코드를 보면..

package Chapter6;

class Human {//클래스를 휴먼으로 보고
// 각 데이터 형에 맞는 변수를 선언해줬다.
//2개 사용 위치
int age;
//3개 사용 위치
int weight;
//3개 사용 위치
int height;
//2개 사용 위치
String name;
//2개 사용 위치 //gender //성별, 성 구분
String gender;

//1개 사용 위치
public Human(int age, int weight, int height, String name, String gender) {
this.age = age;
this.weight = weight;
this.height = height;
this.name = name;
this.gender = gender;
}

//반환할 수 있는 다양한 get()메소드를 직접입력도 가능
// 하지만 IDE에서 제공해주는 기능을 이용해줘도 좋다.
//1개 사용 위치
public int getAge() { return age; }

//1개 사용 위치
public int getWeight() { return weight; }

public int getHeight() { return height; }

public String getName() { return name; }

//1개 사용 위치
public String getGender() { return gender; }

//1개 사용 위치
//BMI 수치를 계산하는 메서드는
-키를 리터럴로 변환해서 제곱을 하고
-이 값으로 몸무게를 나눠야 한다.
따라서 키 나누기 100을 제곱하고,
그 값에 ??를 곱하게 되면..
키를 리터럴로 환산한 값의 제곱이 나오게 된다.
이 값으로 몸무게를 나눠주면 된다.

public double getBMI() {
return Math.round(weight / Math.pow(height, 2) * 10000);
}
}
// 실제로 main()메서드에서는 아래 프린트(클래스명.get변수명())메서드로 호출하면 된다.
public class Assignment {
public static void main(String[] args) {
Human human = new Human(30, 74, 177, "test", "male");

     System.out.println(human.getAge());
     System.out.println(human.getGender());
     System.out.println(human.getName());
     System.out.println(human.getWeight());
     System.out.println(human.getHeight());
     System.out.println(human.getBMI());
     
 }

}

profile
부자한다!

0개의 댓글