객체지향 (1)

Seung·2021년 9월 9일
0

객체지향언어

1. 객체지향언어 특징

  • 코드의 재사용성
  • 유지보수 용이
  • 신뢰성

클래스와 객체

1. 클래스와 객체

  • 클래스
    -정의 : 객체를 정의해 놓은 것 ex) 설계도
    -용도 : 객체를 생성하는데 사용된다
  • 객체
    -정의 : 사물 또는 개념
    -용도 : 객체가 가지고 있는 기능과 속성에 따라 다름

2. 객체와 인스턴스

  • 인스턴스화 (instantiate)
    : 클래스로부터 객체를 만드는 과정
  • 인스턴스 (instance)
    : 만들어진 객체를 해당 클래스의 인스턴스라고 한다.

3. 객체의 구성요소

  • 속성 : 멤버변수(member variable), 특성, 필드, 상태
  • 기능 : 메서드(method), 함수(function), 행위

4. 인스턴스의 생성과 사용

  • 참조변수 타입은 인스턴스의 타입과 일치해야한다
  클래스명 변수명;		//클래스의 객체를 참조하기 위한 참조변수 선언
  변수명 = new 클래스명();        //클래스의 객체 생성 후, 객체의 주소를 참조변수 저장
  
  Tv t;
  t = new Tv();

5. 객체 배열

  • 객체를 생성 후 객체 배열의 각 요소에 저장을 해야한다.
  Tv [] tvArr = new Tv[3];  //길이가 3인 Tv 타입의 참조변수 배열
  tvArr[0] = new Tv();
  tvArr[1] = new Tv();
  tvArr[2] = new Tv();
  
  -> Tv[] tvArr = { new Tv(), new Tv(), new Tv() };

6. 클래스의 또 다른 정의

  • 데이터와 함수의 결합
    - 변수 : 하나의 데이터를 저장할 수 있는 공간
    - 배열 : 같은 종류의 여려 데이터를 하나의 집합으로 저장할 수 있는 공간
    - 구조체 : 서로 관련된 여러 데이터를 종류에 관계없이 하나의 집합으로 저장할 수 있는 공간
    - 클래스 : 데이터와 함수의 결합 (구조체 + 함수)
  • 사용자정의 타입
    : 서로 관련된 변수들을 묶어서 하나의 타입으로 새로 추가하는 것
    class Time{
    	int hour;
       int min;
       int scd;
    }

변수와 메서드

1. 선언 위치에 따른 변수 종류

class Variable
{
	int iv;  //인스턴스 변수
	static int cv;  // 클래스 변수(static 변수)
    
    void method()
    {
    	int lv = 0;   //지역변수
    }

}
  • 인스턴스 변수 : 클래스 영역에 위치, 독립적인 저장공간을 가지므로 서로 다른 값을 가질수 있다.
  • 클래스 변수 : 클래스 영역에 위치, 클래스의 공통적인 값
  • 지역 변수 : 메서드/생성자/초기화 블럭에 위치, 해당 영역내에서만 사용가능

인스턴스 변수는 인스턴스가 생성될 때 마다 생성되므로 각각 다른 값을 유지할 수 있지만, 클래스 변수는 모든 인스턴스가 하나의 저장공간을 공유하므로, 항상 공통된 값을 갖는다.

2. 메서드

  • 메서드의 선언과 구현

    반환타입 메서드이름 (타입 변수명, 타입 변수명, ...)  //선언부
    {						//구현부
    	//메서드 호출시 수행 코드			//구현부
    }						//구현부
    int add(int a, int b) //선언부
    {
    	int result = a + b;  //result는 지역변수
       retunr result;      //호출한 메서드로 결과를 반환
    }

    반환타입이 없는 경우 선언부의 반환타입에 void를 적어야한다.
    반환타입이 void가 아닐 경우 'return 반환값'이 필수다.
    return값은 반환타입과 일치하거나 적어도 자동 형변환이 가능해야만 하다.
    메서드 입력변수는 상관X 반환값은 최대 하나만 허용

  • 메서드의 호출

    메서드이름(값1,값2,....);
    print99danAll();   //void print99danAll() 호출
    int result = add(3,5); //int add(int x, int y) 호출 후 결과 result 저장

3. 기본형 매개변수와 참조형 매개변수

  • 기본형 매개변수 : 변수의 값을 읽기만 할 수 있다.
  • 참조형 매개변수 : 변수의 값을 읽고 변경 할 수 있다.
    메서드 매개변수를 기본형으로 선언시 단순히 저장된 값만 얻는다.
    참조형으로 선언하면 값이 저장된 곳의 주소를 알기에 변경도 가능하다.

4. 참조형 반환타입

  • 반환타입이 참조형이라는 것은 메서드가 '객체의 주소'를 반환한다는 것을 의미한다.

5. 재귀호출

  • 메서드의 내부에서 메서드 자신을 호출하는 것 (!팩토리얼)
  • 논리적 간결함으로 사용

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

  • 인스턴스 변수 사용여부 (클래스 메서드 X, 인스턴스 메서드 O)
  • 클래스의 멤버변수 중 모든 인스턴스에 공통된 값을 유지해야하는지 확인 후 static을 붙인다.
  • 작성한 메서드 중에서 인스턴스 변수나 인스턴스 메서드를 사용하지 않는 메서드에 static을 붙일지 고려한다.

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

  • 같은 클래스에 속한 멤버들 간에는 별도의 인스턴스 생성하지 않고도 서로 참조 또는 호출이 가능하다.
  • 클래스멤버가 인스턴스 멤버를 참조 또는 호출하고자 하는 경우엔 인스턴스를 생성해야한다.
    인스턴스 멤버가 존재하는 시점에 클래스 멤버는 항상 존재하지만, 클래스멤버가 존재하는 시점에는 인스턴스멤버가 존재하지 않을 수도 있다

오버로딩(overloading)

1. 오버로딩이란?

  • 하나의 클래스내에 같은 이름의 메서드를 여러 개 정의하는 것

2. 오버로딩 조건

  • 메서드 이름이 같아야한다.
  • 매개변수의 개수 또는 타입이 달라야한다.
    반환타입은 영향이 없다.

3. 오버로딩의 예

  • 매개변수의 타입 (오버로딩X)

    int add(int a, int b) { return a+b; }
    int add(int x, int y) { retunr x+y; }

    해당 예제는 매개변수 타입이 동일하기에 오버로딩X

  • 리턴타입 (오버로팅X)

    int add(int a, int b) { return a+b; }
    long add(int a, int b) { return a+b; }

    매개변수의 타입과 개수가 일치하므로 오버로딩X
    add(3,3) 을 호출시 어떤 메서드를 호출 될 것인지 결정 불가

  • (오버로딩 △)

    long add(int a, long b) { return a+b; }
    long add(long a, int b) { retunr a+b; }

    add(3,3L) 은 첫번째 메소드 호출
    add(3L,3) 은 두번째 메소드 호출
    add(3,3) 일 경우 어떤 메소드 호출 될지 모르기에 컴파일 에러

  • (오버로딩 O)

    int add(int a, int b) { return a+b; }
    long add(long a, long b) { return a+b; }
    long add(int[] a) {
    	long result = 0;
       for(int i=0; a.length; i++){
       	result += a[i];
       }
       return result;
    }
    

생성자

1. 생성자란?

  • 인스턴스 초기화 메서드

  • 생성자의 이름은 클래스의 이름과 같아야한다.

  • 생성자 리턴 값이 없다. (void 안붙임)

    클래스이름(타입 변수명, 타입 변수명,...){
    	//인스턴스 생성 시 수행될 코드, 
       //주로 인스턴스 변수의 초기화 코드작성
    }
    
    class Card {
    	Card(){			//매개변수가 없는 생성자
       }
    	Card(String k, int num){	//매개변수가 있는 생성자, Card()와 오버로딩
        
       }
    
    }
    Card c = new Card();
    //연산자 new에 의해서 메모리에 Card 클래스의 인스턴스가 생성
    //생성자 Card()가 호출되어 수행
    // 연산자 new 결과로 생성된 Card인스턴스의 주소가 반환되어 참조변수 c에 저장 

2. 기본 생성자

  • 컴파일러가 자동족으로 추가해주는 기본생성자, 매개변수와 내용이 없다.
    클래스 이름() { }
    Card() { }
  • 기본생성자가 컴파일러에 추가되는 경우는 클래스에 정의된 생성자가 하나도 없을 경우에만 생성된다.

3. 매개변수가 있는 생성자

  • 생성자도 메서드처럼 매개변수를 선언하여 호출 시 값을 넘겨 받아서 초기화작업에 사용이 가능하다.

    class Car {
    	String color;
       String gearType;
       int door;
       
       Car() {} 	//생성자
       Car(String C, String g, int d) {   	//생성자
       	color = c;
           gearType = g;
           door = d;
       }
    }
    
    Car c = new Car("White","auto",4);

4. 생성자에서 다른 생성자 호출 this(), this

  • 같은 클래스의 멤버들 간에 서로 호출이 가능하다 this()
    - 조건
    - 생성자의 이름으로 클래스이름 대신 this를 사용한다.
    - 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.
    Car(String color){
    	door = 5;	//첫번째 줄
       Car(color, "auto", 4); // 에러1. 생성자의 두 번째 줄에서 다른 생성자 호출
       			  //this(color, "auto", 4); 로 호출해야함
    }
  • 인스턴스 자신을 가르키는 참조변수 this
    Car(String color, String gearType, int door){
    	this.color = color;
    	this.gearType = gearType;
    	this.door = door;
    }
    //this.color 은 인스턴스 변수
    //color 은 지역변수 (매개변수와 동일)
    //this를 안쓰면 변수명이 동일하여 구분이 안된다.

5. 생성자를 이용한 인스턴스의 복사

  • 현재 사용하고 있는 인스턴스와 같은 상태를 갖는 인스턴스를 하나 더 만들고자 할 때 생성자를 이용할 수 있다.
    Car(Car c){
    	color = c.color;
      	gearType = c.gearType;
     	door = c.door;
    }

변수의 초기화

1. 변수의 초기화

  • 멤버변수는 초기화를 하지 않아도 자동적으로 변수의 자료형에 맞는 기본값을 초기화하지만, 지역변수는 사용하기 전에 반드시 초기화해야한다.
    class InitTest{
    	int x; 		//인스턴스 변수 자동초기화
     	int y = x;	//인스턴스 변수 자동초기화
     	
      	void method(){
       		int i;	//지역변수 -> 자동초기화 불가
               int j = i;  //에러, 지역변수를 초기화하지 않고 사용
    	}

2. 명시적 초기화

  • 변수를 선언과 동시에 초기화하는 것을 명시적 초기화라고 한다.
    class Car {
    	int door = 4;	//기본형 변수의 초기화
    	Engine e = new Engine();	//참조형 변수의 초기화
    }

3. 초기화 블럭

  • 클래스 초기화 블럭
  • 인스턴스 초기화 블럭
    class InitBlock {
    	static { /* 클래스 초기화 블럭 */}
    	{ /* 인스턴스 초기화 블럭 */ }   //잘사용하지 않음->생성자로 초기화
    }

4. 멤버변수의 초기화 시기와 순서

  • 클래스변수
    - 시점 : 클래스가 처음 로딩될 때 다한번 초기화 된다.
    - 순서 : 기본값->명시적초기화->클래스 초기화 블럭
  • 인스턴스변수
    - 시점 : 인스턴스가 생성될 때 마다 각 인스턴스 별로 초기화
    - 순서 : 기본값->명시적초기화->인스턴스 초기화 블럭->생성자
    클래스초기화 -> 인스턴스초기화 순으로 초기화 된다.
profile
한번 해봅시다.

0개의 댓글