본문 바로가기

프로그램 이론/JAVA

[JAVA]객체지향언어의 개념 - 1

1.1. 객체지향언어의 역사

  - 과학, 군사적 모의실험을 위해 컴퓨터를 이용한 가상세계를 구현하려는 노력으로부터 객체지향이론이 시작됨

  - 1960년대 최초의 객체지향언어 Simula탄생

  - 1980년댜 절차방식의 프로그래밍의 한계를 객체지향방식으로 극복하려고 노력함

  - 1995년 말 Java탄생. 객체지향언어가 프로그래밍 언어의 주류가 됨


1.2. 객체지향언어의 특징

  - 기존의 프로그래밍언어와 크게 다르지 않다.

    - 기존의 프로그래밍 언어에 몇가지 규칙을 추가한 것일 뿐이다.

  - 코드의 재사용성이 높다.

    - 새로운 코드를 작성할 때 기존의 코드를 이용해서 쉽게 작성할 수 있다.

  - 코드의 관리가 쉬워졌다.

    - 코드간의 관계를 맺어줌으로써 보다 적은 노력으로 코드변경이 가능하다.

  - 신뢰성이 높은 프로그램의 개발을 가능하게 한다.

    - 제어자와 메서드를 이용해서 데이터를 보호하고, 코드의 중복을 제거하여 코드의 불일치로 인한

      오류를 방지할 수 있다.


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

  - 클래스의 정의 - 클래스란 객체를 정의해 놓은 것이다.

  - 클래스의 용도 - 클래스는 객체를 생성하는데 사용된다.

  - 객체의 정의 - 실제로 존재하는 것, 사물 또는 개념

  - 객체의 용도 - 객체의 속성과 기능에 따라 다름

2.2 객체와 인스턴스

  - 객체와 인스턴스는 비슷한 뜻이다.

   - 객체는 인스턴스를 포함하는 일반적인 의미

  - 인스턴스화

   - 클래스로부터 인스턴스를 생성하는 것

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

  - 객체는 속성과 기능으로 이루어져 있다.

   - 객체는 속성과 기능의 집합이며, 속성과 기능을 객체의 멤버(member, 구성요소)라고 한다.

  - 속성은 변수로, 기능은 메서드로 정의한다.

   - 클래스를 정의할 때 객체의 속성은 변수로, 기능은 메서드로 정의한다.

2.4. 인스턴스의 생성과 사용 - 1

  - 인스턴스의 생성방법

2.4. 인스턴스의 생성과 사용 - 2

2.4. 인스턴스의 생성과 사용 - 3

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

2.5. 클래스의 또 다른 정의

3. 변수와 메서드

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

  - 변수는 선언위치가 변수의 종류와 범위를 결정한다.


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

  - 인스턴스 변수(instance variable)

    - 각 인스턴스의 개별적인 저장공간, 인스턴스마다 다른 값 저장가능

    - 인스턴스 생성 후 참조변수.인스턴스변수명으로 접근

    - 인스턴스를 새성할 때 생성되고, 참조변수가 없을 때 가비지컬렉터에 의해 자동 제거됨

  - 클래스 변수(class variable)

    - 같은 클래스의 모든 인스턴스들이 공유하는 변수

    - 인스턴스 생성없이 클래스이름.클래스변수명으로 접근

    - 클래스가 로딩될 때 생성되고 프로그램이 종료될 때 소멸

  - 지역변수(local variable)

    - 메서드 내에 선언되며, 메서드의 종류와 함께 소멸

    - 조건문, 반복문의 블럭{} 내에 선언된 지역변수는 블럭을 벗어나면 소멸


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

  - 인스턴스변수는 인스턴스가 생성될 때마다 생성되므로 인스턴스마다 각기 다른 값을 유지할 수 있지만

    클래스변수는 모든 인스턴스가 하나의 저장공간을 공유하므로 항상 공통된 값을 갖는다.


3.3. 메서드(method)

  - 메서드란?

   - 작업을 수행하기 위한 명령문의 집합

   - 어떤 값을 입력받아서 처리하고 그 결과를 돌려준다.

   - 입력받는 값이 없을 수도 있고 결과를 돌려주지 않을 수도 있다.

 - 메서드의 장점과 작성지침

  - 반복적인 코드를 줄이고 코드의 관리가 용이하다.

  - 반복적으로 수행되는 여러 문장을 메서드로 작성한다.

  - 하나의 메서드는 한 가지 기능만 수행하도록 작성하는 것이 좋다.

  - 관련된 여러 문장을 메서드로 작성한다.

 - 메서드를 정의하는 방법 - 클래스 영역에만 정의할 수 있음


3.4. return문

  - 메서드가 정상적으로 종료되는 경우

   - 메서드의 블럭{}의 끝에 도달했을 때

   - 메서드의 블럭{}을 수행 도중 return문을 만났을 때

  - return문

   - 현재 실행 중인 메서드를 종료하고 호출한 메서드로 되돌아간다.


3.4. return문 - 주의사항

  - 반환값이 있는 메서드는 모든 경우에 return문이 있어야 한다.

  - return문의 개수는 최소화하는 것이 좋다.

3.5. 메서드의 호출

  - 메서드의 호출방법

3.6. JVM의 메모리 구조

  - 메서드 영역(Method Area)

   - 클래스 정보와 클래스변수가 저장되는 곳

  - 호출스택(Call Stack)

   - 메서드의 작업공간 메서드가 호출되면 메서드 수행에 필요한 메모리 공간을 할당받고

     메서드가 종료되면 사용하던 메모리를 반환한다.

  - 힙(Heap)

   - 인스턴스가 생성되는 공간 new연산자에 의해서 생성되는 배열과 객체는 모두 여기에 생성된다.

3.6. JVM의 메모리구조 - 호출스택

  - 호출스택의 특징

   - 메서드가 호출되면 수행에 필요한 메모리를 스택에 할당받는다.

   - 메서드가 수행을 마치면 사용했던 메모리를 반환한다.

   - 호출스택의 제일 위에 있는 메서드가 현재 실행중인 메서드다.

   - 아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드다.


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

  - 기본형 매개변수 : 변수의 값을 읽기만 할 수 있다.

  - 참조형 매개변수 : 변수의 값을 읽고 변경할 수 있다.


3.8. 재귀호출

  - 재귀호출이란?

   - 메서드 내에서 자기자신을 반복적으로 호출하는 것

   - 재귀호출은 반복문으로 바꿀 수 있으며 반복문보다 성능이 나쁨

   - 이해하기 쉽고 간결한 코드를 작성할 수 있다.

 - 재귀호출의 예

  - 팩토리얼, 제곱, 트리운행, 폴더목록표시 등


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

  - 인스턴스 매세드

   - 인스턴스 생성 후, 참조변수.메서드이름()으로 호출

   - 인스턴스변수나 인스턴스메서드와 관련된 작업을 하는 메서드

   - 메서드 내에서 인스턴스변수 사용가능

  - 클래스메서드(static메서드)

   - 객체생성없이 클래스이름.메서드이름()으로 호출

   - 인스턴스변수나 인스턴스메서드와 관련없는 작업을 하는 메서드

   - 메서드 내에서 인스턴스변수 사용불가

   - 메서드 내에서 인스턴스변수를 사용하지 않는다면 static을 붙이는 것을 고려한다.


3.10. 멤버간의 참조와 호출 - 메서드 호출

  - 같은 클래스의 멤버간에는 객체생성이나 참조변수 없이 참조할 수 있다.

    그러나 static멤버들은 인스턴스멤버들을 참조할 수 없다.


3.10. 멤버간의 참조와 호출 - 변수의 접근

  - 같은 클래스의 멤버간에는 객체생성이나 참조변수 없이 참조할 수 있다.

    그러나 static멤버들은 인스턴스멤버들을 참조할 수 없다.


4. 메서드 오버로딩

 4.1. 메서드 오버로딩(method overloading)이란?

   - 하나의 클래스에 같은 이름의 메서드를 여러 개 정의하는 것을 메서드 오버로딩, 간단히 오버로딩이라고 한다.

   - overload - vt. 과적하다. 부담을 많이 지우다.

4.2. 오버로딩의 조건

  - 메서드의 이름이 같아야 한다.

  - 매개변수의 개수 또는 타입이 달라야 한다.

  - 매개변수는 같고 리턴타입이 다른 경우는 오버로딩이 성립되지 않는다.

  - 리턴타입은 오버로딩을 구현하는 데 아무런 영향을 주지 못한다.


4.3. 오버로딩의 예

  - System.out.println메서드

   - 다양하게 오버로딩된 메서드를 제공함으로써 모든 변수를 출력할 수 있도록 설계

  - 매개변수의 이름이 다른 것은 오버로딩이 아니다.

  - 리턴타입은 오버로딩의 성립조건이 아니다.

  - 매개변수의 타입이 다르므로 오버로딩이 성립한다.

  - 오버로딩의 올바른 예 - 매개변수는 다르지만 같은 의미의 기능수행


5. 생성자

  5.1. 생성자(constructor)란?

    - 생성자란?

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

      - 인스턴스 변수의 초기화 또는 인스턴스 생성 시 수행할 작업에 사용

      - 몇가지 조건을 제외하고는 메서드와 같다.

      - 모든 클래스에는 반드시 하나 이상의 생성자가 있어야 한다.

      - 인스턴스 초기화 : 인스턴스 변수에 적절한 값을 저장하는 것


5.2. 생성자의 조건

   - 생성자의 조건

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

     - 생성자는 리턴값이 없다.

     - 하지만 void를 쓰지 않는다.


5.3. 기본 생성자(default constructor)

  - 기본 생성자란?

   - 매개변수가 없는 생성자

   - 클래스에 생성자가 하나도 없으면 컴파일러가 기본 생성자를 추가한다.

   - 생성자가 하나라도 있으면 컴파일러는 기본 생성자를 추가하지 않는다.



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


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

  - this() : 생성자, 같은 클래스의 다른 생성자를 호출할때 사용

             다른 생성자 호출은 생성자의 첫 문장에서만 가능


5.6. 참조변수 this

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

            모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재


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

  - 인스턴스간의 차이는 인스턴스변수의 값 뿐 나머지는 동일하다.

  - 생성자에서 참조변수를 매개변수로 받아서 인스턴스변수들의 값을 복사한다.

  - 똑같은 속성값을 갖는 독립적인 인스턴스가 하나 더 만들어진다.


6. 변수의 초기화

  6.1. 변수의 초기화

    - 변수를 선언하고 처음으로 값ㅇ르 저장하는 것

    - 멤버변수(인스턴스변수,클래스변수)와 배열은 각 타입의 기본값으로 자동초기화되므로 초기화를 생략가능

    - 지역변수는 사용전에 반드시 초기화를 해주어야한다.

 

 6.2. 멤버변수의 초기화

   - 멤버변수의 초기화 방법


 6.3. 초기화 블럭

   - 클래스 초기화 블럭 : 클래스변수의 복잡한 초기화에 사용되며 클래스가 로딩될 때 실행된다.

   - 인스턴스 초기화 블럭 : 생성자에서 공통적으로 수행되는 작업에 사용되며 인스턴스가 생성될 때 마다

     생성자 보다 먼저 실행된다.


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

   - 클래스변수 초기화 시점 : 클래스가 처음 로딩될 때 단 한번

   - 인스턴스변수 초기화 시점 : 인스턴스가 생설될 때 마다



'프로그램 이론 > JAVA' 카테고리의 다른 글

[JAVA]예외처리  (0) 2018.05.24
[JAVA]객체지향언어의 개넘 - 2  (0) 2018.05.23
[JAVA]배열(Array)  (0) 2018.05.20
[JAVA]조건문과 반복문  (0) 2018.05.20
[JAVA]연산자(Operator)  (0) 2018.05.18