본문 바로가기
JAVA

[JAVA 개념1]객체 지향 프로그램과 기본 개념

by 자유데이터 2018. 11. 10.
반응형


1.객체 지향 프로그래밍(OOP)


자바는 객체 지향 프로그램이다. 자바를 처음 접하신 분들은 이해하는데 조금 어려움을 겪을 수도 있다.
자바에서 아주 중요한 개념 이기 때문에 잘 숙지해야 한다.
이해가 안간다면 여려번 읽어보는 것을 추천한다.

객체 지향 프로그램은 OOP는 Object Oriented Programming의 약자이다. 말그대로 자바는 객체를 지향하는 프로그램이다.
프로그램이 수 많은 객체를 구현할 수 있기 때문에 현실세계에 존재하는 모든 유/무형의 개체를 표현할 수 있는 큰 장점이 있다.
즉, 자바가 객체를 모델링하는 것이다. 여기서 말하는 객체는 무엇일까?


1)객체(Object)란
객체는 사람, 팔, 다리, 자동차, 의자, 커피사는 행위 등 정말 모든 것을 표현할 수 있다.
그렇기 때문에 객체는 필드(속성)와 메소드(동작)로 구성된다. 필드와 메소드는 아래에서 자세히 다루겠다.
좀 더 이해하기 쉽게 아래의 예시를 보자.

                                  <객체 모델링 과정>

현실 세계를 자바로 표현한 것을 "객체 모델링"이라 한다.

객체 모델링하는 연습이 많이 필요하다.


또 다른 예시를 보자.
사람이라는 객체와 전자계산기라는 객체가 있다. 사람은 계산하기 위해 전자계산기의 계산 기능(메소드)를 호출한다.
그리고 계산된 값을 사람에게 돌려준다.(리턴)

  

객체들이 서로 기능(동작)을 주고 받는 것은 매우 중요하다.

사람과 계산기뿐만 아니라 다양한 객체이 존재한다. 따라서 객체들 간의 관계도 다양한데 그 관계에 대해서 자세히 살펴보자.


2)객체간의 관계
객체간의 관계는 집합 관계, 사용 관계, 상속 관계로 이루어져 있다.

집합 관계 : 완성품과 부품의 관계
사용 관계 : 객체가 다른 객체를 사용하는 관계
상속 관계 : 종류 객체와 구체적인 사물 객체 관계

아래의 사람과 자동차의 관계 예시를 통해 좀 더 이해해보자.
                                                  <객체 관계도>

앞으로 객체를 만들때 객체간의 관계(3가지)를 잘 파악하고 만들어야 한다.


3)객체 지향 프로그래밍 특징
처음 공부를 한다면, 특징에 대한 자세한 내용은 어려울 수 있다. 
이해가 안간다면 그냥 이런게 있구나 하고 넘어가고 나중에 다시 읽어보자.

-캡슐화(Encapsulation)
클래스로 객체의 필드, 메소드를 묶고 실제로 구현하는 내용을 감추는 것이다.
보호하는 이유는 외부의 잘못된 사용(마음대로 변경)으로 인한 오남용을 막기 위함이다.

하지만, 객체의 상호작용을 위해 공개할 멤버(필드, 메소드)를 적절히 결정해야하고 이 결정을 접근 제한자(Access Modifier)를 사용한다.
접근 제한자(Access Modifier)는 멤버의 노출과 숨기는 기능 둘 다 가능하다.

-상속
상위(부모) 객체의 필드와 메소드를 하위(자식) 객체에게 그대로 물려주는 행위이다.
하위 객체는 상위 객체를 확장해서 추가적인 필드와 메소드를 가질 수 있다.

상속 대상: 필드와 메소드

상속을 하는 이유(효과)
--상위 객체를 재사용하여 하위 객체를 빨리 개발할 수 있다.
--반복되는 코드의 중복을 줄인다.
--유지 보수가 편리하다. 상위 객체의 필드나 메소드를 조금만 바꾸더라도 하위까지 바로 전달된다.
--객체의 다형성을 구현할 수 있다. //다형성 : 부품 객체를 조립해서 하나의 커다란 객체를 완성하는 것.
  상속없이 다형성을 말할 수 없다.

              <상속 그림 ; 머리가 비어있는 실선 화살표는 상위 객체를 가리킨다.>

-다형성(Polymorphism)
같은 타입이지만 실행 결과가 다양한 객체를 대입할 수 있는 성질
상위 객체로 틀(형태)를 만들고 소재(필드, 메소드)가 다른 객체를 부품화 하면서 다형성이 생긴다.
따라서, 객체를 부품화시키는 것이 가능하고 유지보수가 용이한 효과가 있다.

                                                                   <다형성 현실 예시>

상속과 다형성은 중요한 개념으로 나중에 더 자세히 다루겠다.

다음부터 자바에서 정말 중요한 기본 개념들이 나온다. 객체를 이해했다면, 이제는 객체를 어떻게 설계하고 생성하며, 어떤 기능을 구현하는지 등 자세히 알아보자.


2.클래스(Class)
클래스는 객체(인스턴스)를 만들기 위한 설계도이다.
클래스(설계도)를 통해 인스턴스(객체)를 만드는 것을 인스턴스화한다고 말한다. 클래스는 대문자로 선언하는 것이 관례이다.
이때, 설계도에 들어가는 요소로 필드와 메소드가 필요하다.

자바 프로그램을 이용하면서 객체를 만들기 위해 클래스를 선언할때,
만들고자하는 객체의 이름을 사용하는 경우가 흔하다. 이 때문에 클래스를 객체라고 생각하는 오류를 조심해야 한다.


3.생성자(Constructor)
생성자는 객체가 생성될 때마다 실행되는 메소드를 말하며,
객체를 생성할 때마다 변수를 초기화하거나 어떤 기능을 주고 싶을 때 사용한다.

new 연산자에 의해 호출되는 경우는 객체의 초기화 담당을 한다.
즉, 클래스이름 변수 = new 클래스이름(); 의 경우 같은 설계도(클래스)를 가지고 필드를 다르게 설정하여 다양한 객체를 만들 수 있다. 
각 변수는 다른 객체의 주소를 갖는다.

new 연산자에 의해 힙영역에 객체가 생성된다. 이때 생성된 객체는 스택영역에 저장된 클래스를 참조하기 때문에,
각 변수(주소 담는 그릇)를 참조하고 있다.

new 연산자가 없어도 모든 클래스는 기본 생성자(Default Constructor)를 반드시 가지고 있다.
기본 생성자 선언을 생략하면 컴파일러가 자동으로 추가한다. 
이때 기본 생성자는 매개변수가 없어야 한다. 만약 매개변수를 만들 경우는 반드시 선언을 해주어야 한다.
매개변수도 지역변수다.


**오버로딩(Overloading)
한 클래스에서 여러개의 생성자를 선언하는 기술이다. 다양한 객체를 만들기 위해 매개변수를 다르게 할 때 사용한다.
이때 생성자는 매개변수의 타입, 개수, 순서가 다르게 선언되어야 한다.



오버로딩에서 자주 쓰이는 this가 있다.
this는 클래스로부터 생성된 객체 그 자체이고 클래스 블록 안에서만 쓸 수 있다.
한 클래스에서 다양한 객체를 만들때 매번 필드명을 다르게 설정하는 번거로움을 해결해준다.

**this의 역할
1.생성자 매겨변수와 필드명의 이름 충돌을 막기 위해
2.생성자 호출하기 위해

예시를 보면 확실하게 알 수 있다.

ex)
class ThisExample {                                                        
      int age;                                                                       
      String name;                                                              
      int hight;                                                                    
                                                                                        
//this 없을 때  
ThisExample(int a, String n, int h){
age = a;
name = n;
hight = h;
}
//this 있을 때
ThisExample(int age, String name, int hight){
this.age = age;
this.name = name;
this.hight = hight;
}
}//end class


4.필드
필드는 객체의 데이터가 저장되는 곳으로,
주로 [고유 데이터] [객체의 상태] [객체의 부품]으로 나뉜다.

    -필드의 사용 위치
  • 객체 내부 : "필드이름" 으로 바로 접근
  • 객체 외부 : "변수.필드이름" 으로 접근
여기서 점( . )은 멤버참조 연산자를 말한다.


5.메소드
객체의 동작을 담당하는 함수라고 생각하면 된다.
메소드는 매개변수가 없어도 되는데, 반드시 선언 해야하는 값을 잊어버리지 않게 하기 위해 매개변수를 준다.
매개변수란, 메소드를 호출할때 넘겨주는 값을 말한다.

-메소드 호출 방법
외부에서 호출하는 경우는 객체를 생성한 후, 참조 변수를 이용해 호출한다. (필드와 동일하다.)

**생성자와 메소드
앞에서 모든 클래스는 생성자를 갖고, 특별히 선언해주지 않으면 컴파일러가 자동으로 추가해준다고 언급했다.
이 기본 생성자 말고, 만약 매개변수 값을 주거나 다른 기능을 추가하기 위해 생성자를 선언할때,
간혹 메소드와 혼동하는 경우가 있다.

-메소드
  : 첫글자를 소문자로 쓴다.

-생성자는 
  : 클래스와 같은 이름의 메소드로 만든다. (대문자로 시작한다.)
  : 리턴타입을 정의하지 않는다.
  : 매개변수를 지정하여 혹시 메인 클래스에서 코드작성시 변수선언을 잊어버리는 것을 방지한다.
  : 오버로딩을 통해 다양한 객체를 만들 수 있다.


6.인스턴스 vs static
필드나 메소드에 static이 붙으면 객체들이 가질 수 있는 공용적인 데이터를 말한다.
즉, 객체와 무관한(소속되지 않은) 필드와 메소드를 말한다.

정적멤버는 힙이 아닌 메소드 영역에 들어감.(메소드 영역은 .java를 바이트 그대로 저장하는 곳)
static이 없으면 인스턴스라고 하는데 객체의 고유 특성이라고 생각하면 된다. 

정리하면,

-필드
  • 객체별로 가지고 있어야 할 데이터 --> 인스턴스 필드
  • 공용적인 데이터 --> 정적 필드
ex)
public class Calulator{                                                                                      
    String color;                       //계산기 별로 색깔이 다를 수 있다.         
    static douvle pi = 3.141582        //계산기에 사용되는 파이값은 동일하다.
                                                                                                                      


-메소드
  • 인스턴스 필드로 작업해야 할 메소드 --> 인스턴스 메소드
  • 인스턴스 필드로 작업하지 않는 메소드 --> 정적 메소드

인스턴스필드 초기화 해주는 것은 생성자. 정적필드 초기화 해주는 것은 이니셜라이저.


7.Getter와 Setter
Getter의 필요성 : 읽기 전용 필드가 있을 수 있음.
Setter의 필요성 : 외부에서 엉뚱한 값으로 변경할 수 없도록.

-getter setter 만드는 이유.
필드의 무결성 유지 (무결성: 데이터를 보호하고, 항상 정상인 데이터를 유지하는 것 )( 특히 Setter의 무결성 )
private로 데이터를 보호하고 set에서 정상인 데이터를 유지하기 위해 조건을 걸어준다.
Get은 호출자가 원하는 값으로 돌려주는 역할을 한다.(단위 변환이 예)
Getter Setter를 가지고 있는 클래스를 빈(bean)클래스라고 부른다.
Getter Setter의 필드와 속성은 다르다












반응형

댓글