객체지향 프로그래밍 1

geonu·2022년 2월 20일
0
post-custom-banner

출처 : 자바의 정석
http://www.yes24.com/Product/Goods/24259565
https://cafe.naver.com/javachobostudy/20665

아래의 내용은 '자바의 정석'이라는 책의 내용을 간략하게 정리한 글입니다.

객체지향언어

객체지향언어의 역사

객체지향이론은 과학자들이 모의실험을 위해 실제 세계와 유사한 가상 세계를 컴퓨터 속에 구현하고자 만든 이론이다.

객체지향이론이란

'실제 세계는 사물(객체)로 이루어져 있고 실제 세계의 모든 사건은 사물(객체)들 간의 상호작용이다.'라는 이론이다.

현재의 객체지향 프로그래밍언어

1960년대 중반에 객체지향이론을 프로그래밍언어에 적용한 시뮬라(Simula)라는 최초의 객체지향언어가 탄생했다. 초기에 절차적 프로그래밍언어에 밀려 주목받지 못했으나 프로그램의 규모가 커지고 빠르게 변하는 사용자의 요구에 절차적 언어로는 한계가 존재했기에 객체지향언어가 대안으로 떠올랐다.
1995년에 자바가 공개되고 1990년대 말에 인터넷의 발전으로 인해 객체지향언어가 크게 주목받게 되었다.

특징

  1. 코드의 재사용성이 높음
  2. 코드의 관리가 용이
  3. 신뢰성이 높은 프로그래밍 가능

클래스와 객체

클래스란 객체를 정의해 놓은 것이고 객체를 메모리에 생성하는데 사용한다. (설계도=클래스, 제품=객체)

인스턴스란

class Game {
	String name;
    boolean start;
	int totalScore;
    
    void gameStart { start = true; }
    void gameEnd { start = false; }
    void scoreUp { ++totalScore; }
    void scoreDown { --totalScore; }
}

class gameTest {
	public static void main(String[] args){
    	Game game;
        game = new Game();
        game.name = "점수게임";
        game.totalScore = 100;
        game.gameStart();
        game.scoreDown();
    }
}

  1. Game game;
    참조변수 game 생성

  2. game = new Game();
    메모리의 비어있는 공간에 인스턴스 생성 후 참조변수에 주소값 저장

  3. game.name = "점수게임"; game.totalScore = 100;
    인스턴스 맴버변수에 값 저장

  4. game.gameStart(); game.scoreDown();
    인스턴스 내의 함수를 호출하여 맴버변수 값 수정

인스턴스는 참조변수를 통해서만 다룰 수 있고 참조변수의 타입은 인스턴스 타입과 일치해야한다.

변수와 메서드

class Game {
//클래스 영역

    String instanceVariable;	//인스턴스변수
    
    static String classVariable;			//클래스 변수(static변수, 공유변수)
    public static String globalVariable;	//클래스 변수(전역변수)
    //전역변수는 같은 프로그램 내에서 어디서든 접근 가능한 변수이다.
    
    void gameStart { 
    //매소드 영역
    	String localVariable;	//지역변수 
    }
}

매서드(method)는 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것
1. 높은 재사용성(reusability)
2. 중복된 코드의 제거
3. 프로그램 구조화

static 메서드는 같은 클래스 내의 인스턴스 매서드를 호출할 수 없다.
static 매서드 호출 시기에 인스턴스가 생성이 되지 않았을 수 있기 때문이다.

JVM(Java Virtual Machine)

JVM 메모리 구조

  1. Method Area (메소드 영역)
    *.class를 읽어 클래스에 대한 정보를 저장한다.

  2. Call stack or Execution stack (호출스텍)
    메서드의 작업에 필요한 메서드 공간을 제공한다.

  3. Heap (힙)
    인스턴스가 생성되는 공간이다.

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

기본형 매개변수 : 변수의 값을 읽기만 할 수 있다. (read only)
참조형 매개변수 : 변수의 값을 읽고 변경할 수 있다. (read & write)

참조형 매개변수는 값이 아닌 값이 저장된 주소를 가지고 있기에 변경도 가능하다.

재귀함수

매서드 내부에서 자기 자신(매소드)을 다시 호출하는 것이 재귀함수이다.
재귀함수를 사용할 때는 재귀함수가 주는 간결함이 재귀함수의 비효율보다 더 이득이라고 생각할 때 사용해야한다.

재귀함수는 자칫 잘못 사용하면 무한재귀에 빠지므로 매개변수의 유효성 검사가 중요하다.

클래스 매서드(static)와 인스턴스 매서드

  • 클래스를 설계할 때, 맴버변수 중 모든 인스턴스에 공통으로 사용하는 것에 static을 붙인다.

  • 클래스 변수는 인스턴스를 생성하지 않아도 사용 가능하다.

  • 클래스 매서드는 인스턴스 변수를 사용할 수 없다.
    - 클래스 매서드 생성 시기에 인스턴스가 생성되어 있지 않았을 경우가 있기 때문에 클래스 매서드에는 인스턴스 변수를 사용할 수 없다.

  • 매서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.
    - 호출시간이 짧아지므로 성능이 향상된다.

오버로딩 (overloading)

매서드 이름은 동일하게, 매개변수는 개수 또는 타입을 다르게 하여 이름이 같은 매서드를 여러개 만드는 것을 매서드 오버로딩(method overloading) 또는 오버로딩(overloading)이라 한다.
반환 타입은 오버로딩 구현에 영향을 주지 못한다.

ex)

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

위 코드는 매서드가 구분될 수 있기 때문에 오버로딩으로 간주한다.
하지만 sum(5,5)과 같이 호출하면, 위 두 매소드 중 무엇이 호출된 것인지 모르기 때문에 에러가 발생한다.

장점

여러 이름을 하나의 이름으로 정의할 수 있어 매서드의 이름을 절약할 수 있다.

가변인자(varargs)

기존에는 매소드의 매개변수 개수가 고정적이었으나, JDK1.5부터 동적으로 지정해 줄 수 있게 되었으며, 이 기능을 가변인자(variable arguments)라고 한다.

형식 : 타입... 변수명
ex) public PrintStream printf(String format, Object... args) {...}

  • 가변인자를 매개변수 중에 가장 마지막에 선언해야한다.
    가변인자인지 아닌지 구별할 수 없기 때문에 에러가 발생할 수 있다.

  • 가변인자는 선언된 매서드를 호출할 때마다 배열을 새로 생성하기 때문에 비효율적인 면이 존재한다.

  • 가변인자를 사용한 매서드는 오버로딩하지 않는 것이 좋다.

생성자(Constructor)

생성자는 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 매서드'이다.
생성자 앞에 리턴값이 없음을 뜻하는 void를 사용하지 않고 아무것도 적지 않는다.

조건

  1. 생성자의 이름은 클래스의 이름과 같아야 한다.
  2. 생성자는 리턴 값이 없다.

인스턴스를 생성할 때 반드시 클래스 내에 정의된 생성자 중의 하나를 선택하여 지정해주어야 한다.
하지만 생성자가 없는 클래스의 인스턴스가 생성 가능했던 이유는 컴파일러가 제공하는 '기본 생성장' 때문이다.
주의할 점은 기본 생성자가 컴파일러에 의해 추가되는 경우는 클래스에 정의된 생성자가 하나도 없을 때 뿐이라는 점이다.

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

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

생성자에서 다른 생성자를 호출할 때 첫 줄에만 가능한 이유는 첫 줄이 아닌 중간 줄에 호출시 이전에 처리했던 맴버변수의 초기화가 무의미해질 수 있기 때문이다.

'this'를 사용할 수 있는 것은 인스턴스맴버만 가능하다.

  • this는 인스턴스 자신을 가리키는 참조변수로, 인스턴스의 주소가 저장되어 있다.

변수의 초기화

맴버변수(클래스변수와 인스턴스변수)와 배열의 초기화는 선택적
지역변수의 초기화는 필수적

맴버변수 초기화 방법

  1. 명시적 초기화(explicit initialization)
int score = 100;
  1. 초기화 블럭(initialization block)
    복잡한 초기화 작업이 필요할 때 초기화 블럭 또는 생성자를 사용한다.
class test{
	{}	//인스턴스 초기화 블럭
    static {}	//클래스 초기화 블럭
    ...
}

인스턴스 초기화 블럭이 생성자보다 먼저 실행된다.

맴버변수의 초기화 시기와 순서

profile
시작이 있어야
post-custom-banner

0개의 댓글