[CH6. 객체지향프로그래밍1] 오버로딩

4. 메서드 오버로딩

4.1 메서드 오버로딩이란?

한 클래스 내에 같은 이름의 메서드를 매개변수를 다르게 해서 여러개 정의 하는것.

4.2 오버로딩의 조건

  1. 메서드 이름이 같아야 한다.
  2. 매개변수의 개수 또는 타입이 달라야 한다.
  3. 매개변수는 같고 리턴타입이 다른 경우는 오버로딩이 성립되지 않는다.

4.3 오버로딩의 예

1
2
3
4
5
6
7
8
9
10
void println();
void println(booleand x);
void println(char x);
void println(char[] x);
void println(double x);
void println(float x);
void println(int x);
void println(long x);
void println(String x);
void println(Object x);
  • 매개 변수의 타입과 개수가 같아서 오버로딩 성립 안하는 예

    1
    2
    int add(int a, int b){ return a+b;}
    int add(int x, int y){ return x+y;}
  • 리턴 타입만 다른 경우 오버라이딩 성립 안함

    1
    2
    int add(int a, int b){ return a+b;}
    int add(int a, int b){ return (long) a+b;}
    • 같은 매개변수를 순서만 바꿔서 작성하면 오버로딩이지만 헷갈리는 좋지 않은 방법
      1
      2
      int add(int a, long b){ return a+b;}
      int add(long a, int b){ return a+b;}

4.4 오버로딩의 장점

  • 동일 기능의 메서드가 하나의 이름으로 정의될 수 있음
  • 메서드 이름 절약가능

5. 생성자(Constructor)

5.1 생성자란?

인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드

  1. 생성자의 이름은 클래스의 이름과 같아야함
  2. 생성자는 리턴 값이 없음
  • new 연산자가 인스턴스를 생성하는것이지, 생성자가 인스턴스를 생성하는것은 아님

5.2 기본 생성자(default constructor)

생성자를 안 만들어도 컴파일러가 기본으로 생성자 하나 만들어줌.
publid 클래스이름(){};

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Data1{
int value;
}

class Data2{
int value;

Data2(int x){
value = x;
}
}

class ConstructorTest {
public stataic void main(String[] args){
Data1 d1 = new Data1();
//컴파일 에러 발생
Data2 d2 = new Data2();
Data2 d2 = new Data2(int 1);
}
}

5.3 매개변수가 있는 생성자

인스턴스 생성할때 초기값을 넣어 초기화 할 수 있음

1
2
3
4
5
6
7
8
9
10
11
12
class Car{
String color;
String gearType;
int door;

Car(){}
Car(String c, String g, int d){
color= c;
gearType = g;
door =d;
}
}

이렇게 사용하면 됨

1
Car c = new Car("white", "auto", 4};

5.4 생성자에서 다른 생성자 호출하기 - this(), this

같은 클래스 내에서 생성자도 아래 조건을 만족 할 경우 서로 호출이 가능함

  • 생성자의 이름으로 클래스 이름 대신 this를 사용한다.
  • 한 생성자엥서 다른 생성자를 호출할 때는 반드시 첫줄에서만 호출이 가능하다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    class Car{
    String color;
    String gearType;
    int door;

    Car(){
    this("white", "auto", 4);
    }

    Car(String color){
    this(color, "auto", 4}

    Car(String color, String gearType, int door){
    this.color= color;
    this.gearType = gearType;
    this.door =door;
    }
    }
  • this - 인스턴스 자신을 가리키느 ㄴ참조변수, 인스턴스의 주소가 저장되어있다.
    모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재한다.

    • this.(), this(매개변수) - 생성자, 같은 클래스의 다른 생성자를 호출 할 때 사용한다.

5.5 생성자를 이용한 인스턴스 복사

동일한 현재 상태를 갖는 인트턴스 하나 더 생성할때 생성자를 사용함.
어떤 상태인지 자세히 몰라도 똑같은 인스턴스 새로 추가 가능.

1
2
3
4
5
Car(Car c){
color= c.color;
gearType = c.gearType;
door =c.door;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Car{
String color;
String gearType;
int door;

Car(){
this("white", "auto", 4);
}

Car(Car c){
color= c.color;
gearType = c.gearType;
door =c.door;
}
Car(String color){
this(color, "auto", 4}

Car(String color, String gearType, int door){
this.color= color;
this.gearType = gearType;
this.door =door;
}
}

*** 인스턴스를 생성할 때는 아래 두가지 사항을 결정해야함

  1. 클래스 - 어떤 클래스의 인스턴스를 생성할 것인가?
  2. 생성자 - 선택한 클래스의 어떤 생성자로 인스턴스를 생성할것인가?

[CH6. 객체지향프로그래밍1] 변수와 메서드

3. 변수와 매서드

3.1 선언위치에 따른 변수의 종류

변수의 종류 선언위치 생성시기
클래스변수 클래스 영역 클래스가 메모리에 올라갔을 때
인스턴스 변수 클래스 영역 인스턴스가 생성되었을때
지역변수 클래스 영역 이외의 영역 (메서드, 생성자, 초기화 블럭 내부) 변수 선언문이 수행되었을때
1
2
3
4
5
6
7
8
class Variables{
int iv; //인스턴스 변수
static int cv; //클래스 변수(static 변수, 공유변수)

void method(){
int iv; // 지역변수
}
}
  1. 인스턴스 변수
    • 클래스 영역에 선언, 인스턴스 생성때 만들어짐
  2. 클래스 변수
    • 인스턴스 앞에 static을 붙임.
      한 클래스의 모든 인스턴스들이 공통적 값을 유지해야 되는 경우 사용.
      public을 붙이면 프로그램 내 전역에서 사용가능
  3. 지역 변수
    • 매서드 내 선언. 메서드 내에서만 사용가능. 메서드 종료시 소멸.

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

1
2
3
4
5
6
 class Card {
String kind; // 카드 무늬 - 인스턴스변수
int number; // 카드 숫자 - 인스턴스 변수
static int width = 100; // 카드 폭 - 클래스 변수
static int height = 250; //카드 높이 -클래스 변수
}

인스턴스 변수는 인스턴스가 생성될 때마다 각기 다른 값을 유지,
클래스 변수는 모든 인스턴스가 하나의 저장공간을 공유해서 항상 공통된 값 가짐

3.3 메서드

  • 하나의 메서드는 되도록 하나의 기능만 수행하도록 하는것이 좋다.
  • 반복적으로 수행되야 하는 여러 문장을 하나의 메서드로 정의해놓으면 좋다
  • 관련된 여러 문장을 하나의 메서드로 만들어 놓는 것이 좋다.

3.4 return 문

  • 메서드가 정상적으로 종료되는 경우
    1. 메서드의 블럭{}내의 마지막 문장을 수행했을 때
    2. 메서드의 블럭{}내에 있는 문장을 수행중 return 문을 만났을때.
  • return 문은 실행중인 메서드를 종료 후 호출 메서드로 되돌아감
    1. 반환값이 없는 경우 : return;
    2. 반환값이 있는 경우 : return 반환값;

3.5 메서드의 호출

참조변수.메서드이름();
참소변수.메서드이름(값1, 값2, ..);

3.6 JVM의 메모리 구조


  1. Method Area(메서드영역)
    클래스/데이터

  1. Call Stack(호출스택)
    Main

  1. Heap(힙)
    인스턴스

3.7 기본형 매개변수와 참조형 매개변수

기본형 매개변수 - 변수의 값 읽기만 할 수 있음
참조형 매개변수 - 변수의 값을 읽고 변경 할 수 있음.

3.8 재귀호출

f(n) = n* f(n-1)

3.9 클래스(static 메서드)와 인스턴스메서드

  1. 클래스 설계할 때, 멤버 변수 중 모든 인스턴스에 공통적으로 사용해야하는 것에 static 을 붙인다.
  2. 클래스 변수(static변수)는 인스턴스를 생성하지 않아도 사용할 수 있다.
  3. 클래스 메서드는 인스턴스 변수를 사용할 수 없다.
  4. 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.

3.10 클래스멤버와 인스턴스멤버간의 참조와 호출

인스턴스 멤버가 존재할때는 클래스멤버는 항상 존재하지만,
클래스맴버가 존재하는 시점에 인스턴스멤버가 존재할수도 있고 없을수도 있음.

[CH6. 객체지향프로그래밍1] 클래스와 객체

1. 객체지향 언어

  1. 코드의 재사용성이 높다.
  2. 코드의 관리가 용이하다.
  3. 신뢰성이 높은 프로그래밍을 가등하게 한다.

2. 클래스와 객체

2.1 클래스와 객체의 정의와 용도

클래스: 객체를 정의 해놓은것으로 객체를 생성할때 사용한다.

클래스 객체
제품설계도 제품
TV설계도 TV
붕어빵 기계 붕어빵

2.2 객체와 인스턴스

클래스 —(인스턴스화)—> 인스턴스(객체)

2.3 객체의 구성요소 - 속성과 기능

1
2
속성(propertiy) - 맴버변수(member variable), 특성(attribute), 필드(field), 상태(state)  
기능(function)- 매서드(method), 행위(behavior), 함수(function)
  • TV의 속성과 기능
속성 기능
크기, 길이, 높이, 색상, 볼륨, 채널 등 켜기, 끄기, 볼륨 높이기, 볼륨 낮추기, 채널 변경하기

속성-> 맴버변수
기능->매서드

  • TV 클래스
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Tv {
    //Tv의 속성(맴버변수)
    String color;
    boolean power;
    int channel;

    //Tv의 기능(매서드)
    void power(){ power=!power;}
    void channelUp(){++channel;}
    void channelDowun(){--channel;}
    }

2.4 인스턴스의 생성과 사용

클래스 변수명; // 클래스의 객체를 참조하기 위한 참조변수를 선언한다.
변수명 = new 클래스명(); // 클래스의 객체를 생성 후 , 객체의 주소를 참수변수에 저장한다.

Tv t;
t = new Tv();

  • TvTest.java
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    class Tv {
    //Tv의 속성(맴버변수)
    String color;
    boolean power;
    int channel;

    //Tv의 기능(매서드)
    void power(){ power=!power;}
    void channelUp(){++channel;}
    void channelDowun(){--channel;}
    }


    class TvTest{
    public static void main(String args[]){
    Tv t; // 메모리에 참조변수 t의 공간 생김
    t = new Tv(); // t에 객체 주소값이 저장, 메모리 공간에 TV 클래스 인스턴스가 생김
    t.channel = 7; //t에 저장된 주소에 있는 인스턴스 멤버변수 channel에 7저장
    t.channelDown(); //t가 참조하는 Tv인스턴스 channelDowun매서드 호출->channel1감소
    }
    }

2.5 클래스의 또 다른 정의

  1. 클래스 - 데이터와 함수의 결합

    1. 변수 - 하나의 데이터를 저장할 수 있는 공간
    2. 배열 - 같은 종류의 여러 데이터를 하나의 집합으로 저장할 수 있는 공간
    3. 구조체 - 서로 관련된 여러 데이터를 종류에 관계없이 하나의 집합으로 저장할 수 있는 공간
    4. 클래스 - 데이터와 함수의 결합(구조체+함수)

    5. 클래스 - 사용자 정의 타입

서로 관련된 변수를 묶어서 하나의 타입으로 새로 추가

1
2
3
int hour;
int minute;
float second;

1
2
3
4
5
class Time{
int hour;
int minute;
float second;
}
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×