본문 바로가기

IT/공부

[프로그래밍] 객체지향, 메서드 문법, OverLoading, getter 메서드

객체지향이라는 방법을 통해 real world를 system화 할 때 real world의 모든 것을 객체라 한다. 

그리고 객체의 공통적인 속성을 추출하는데, 이 과정은 system(문제영역, 어떤 system을 개발할 것인가)에 의존적이다. 

왜냐면 객체의 속성은 무한대이기 때문이다. 시스템에 따라 필요한/필요하지 않은 속성이 다르다.

공통되는 속성을 추출하는 것을 Static Modeling, 행위를 추출하는 것을 Dynamic Modeling이라 한다.


추상화 과정을 통해 추출한 행위와 속성의 모임이 클래스이다. 클래스에서는 행위를 메서드, 속성을 필드라 한다.

클래스에는 실행을 위한 어플리케이션클래스와 오브젝트모델링을 표현한 빈클래스가 있다.



공통적인 특성을 많이 가지고 있는 클래스는 제너럴라이제이션 클래스, 일반화된 클래스이다. 

구체적인 개별적 특성을 많이 가지고 있는 클래스는 스페셜라이제이션 클래스, 구체적 클래스이다.

제너럴라이제이션 클래스는 공통적인 속성, 행위를 갖고있기 때문에 구체적인 클래스에서 이를 가져갈 수 있다.

가져가는 것을 모델링 과정에선 "공유"라 하고, 자바에서는 "상속"이라 한다.

상속은 다형성을 구현하기 위한 방법이라고 생각할 수 있다.

다형성이란 하나의 작동방법(인터페이스)를 여러 방법으로 사용할 수 있음을 나타낸다.

예를 들어 스마트폰으로 전화거는 방법을 안다면, 핸드폰의 제조사가 삼성이든 LG든 애플이든 그 사람은 전화걸기를 수행할 수 있다.

반대로 다형성이 구현되지 않아서 불편한 점을 생각해보면 문서작성프로그램이 한글, MS Word 등 통일되지 않았기때문에 각 프로그램의 사용법을 따로 익혀야 한다.

다형성을 지원하는 문법에는 Method OverRiding, Method OverLoading 등이 있다.


캡슐화란 정보를 숨기는 것을 의미한다.

real world는 캡슐화되어있다. 길 가는 사람의 이름, 전화번호 등 식별값을 모르는 것이 그 예이다.


===============================


이제는 코드를 보며 배울텐데, 모델링을 통해 빈클래스를 개괄적이고 구체적으로 만들고 수정보완해가며 Bean클래스를 완성하려고 한다.


우선 강의 활동과 개발 활동을 하는 홍길동을 Object Modeling 한다. 

명사화 가능한 것을 Static Modeling하면, 이름:홍길동, 직업:개발자, 평균 수입:100, 개발 경력이 있을 것이다.

Dynamic Modeling에는 우선 프로젝트에 참여하다, 강의하다 두 가지를 고려한다.


처음엔 구체적으로 Implement를 할건데, 이는 real world를 제대로 표현하지 못한다고 할 수 있다. 왜냐하면 이 클래스에는 이름, 직업, 수입 등이 공개되어 있고 캡슐화되어 있지 않기 때문이다. 하지만 real world는 얼굴만 보고 이름을 알 수 없듯이 제대로 된 Bean Class려면 후에 수정 보완이 필요하겠다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Developer 
{
    String name = "홍길동";
    String job = "개발자";
    int avgincome = 100;
    int projectCareer; //초기화
 
    public void participateProject(){
        System.out.println("프로그램 개발로 수입 증가, 경력 쌓음.");
        avgincome++;
        projectCareer++;
    }
 
    public void instruct(){
        System.out.println("강의를 통한 수입증가");
        avgincome++;
    }
}
cs


필드를 표현할 때 초기화 하지 않으면 자동 초기화가 된다. 

그리고 각 메서드는 관련된 상태(필드)를 작업한다. 


이 클래스를 실행하기 위해선 어플리케이션클래스가 필요하다. 

어플리케이션 클래스에서는 빈클래스를 데이터타입으로 하는 변수를 이용해 인스턴스를 생성해야 빈클래스의 필드와 메서드가 사용 가능하다

변수.필드명

.오퍼레이터는 ~안에 있는 ~에 접근해서 라는 연산자이다.


====================================


Method Syntax

메서드는 message라고도 한다. 어떤 행위를 하라고 전달하기 때문이다.


메서드는 

(접근제한자: public 등) (void 혹은 data type) (메서드명) (입력받는 인자);

처럼 생겼다.


아직 접근제한자는 안배웠으니 넘어가고, 두번째를 보면 void 혹은 data type이 적혀있다.

void는 메서드 안에 있는 return이 반환해주는 데이터가 없다는 의미이다.

메서드 안에 return 이 없다면 void라고 적어야한다.


만일 int라고 되어 있다면 메서드 안에

return 정수

라고 되어있는 것이다.


1
2
3
public int sum(int i, int j){;
    return i+j;
}
cs


라는 메서드가 있다면 i 와 j 두 정수를 입력받아 그 합을 출력하는 행위를 한다.

이 때 메서드 명 오른 쪽에 ()안에는 받아야 하는 입력값을 적고, 입력값 개수가 2이상일 경우에 CSV , 를 이용하여 구분한다.


메서드 sum이 있는 클래스를 A라 하고, 다른 클래스 ATest에서 위의 메서드를 다음과 같이 가져온다.

1
2
3
4
5
6
public class ATest{
    public static void main(String[] args){
        A a = new A();
        int value = a.sum(1,1);
    }
}
cs

여기서 a.sum(1.1)의 데이터 타입은 int임을 알 수 있다.


만일 return 해주는 값이 true/false일 때에는 메서드 앞에 boolean이라는 데이터타입을 적어주면 된다.


real world에서는 객체에 대해 알고싶은 것이 있을 때엔 물어봐야 한다.

이름이 뭐에요? 라고 물어봐야 그 객체의 이름을 알 수 있다.

시스템에서는 이를 get알고싶은내용 을 camel case를 이용해 적으면 된다.

그렇다면 빈클래스에 필드가 있다면 필드를 반환해주는 get 메서드가 있어야 하는 것이다. 


return을 이용해 반환받는 값은 1개만 가능하다.

그래서 필드가 여러개인 경우에 그 필드들을 한 번에 받고 싶다면 필드들을 배열로 설정해 하나의 배열을 return해주면 된다.


ATest클래스에서 get 메서드를 이용해 배열을 출력해야 한다면, 

소스코드를 모르고 있는 상태에서는 배열이라는 데이터타입만 알 뿐 배열의 길이를 알 수 없다. 따라서 출력할 때에

String[] info = a.getAllInformation();

for(int i = 0;i<info; i++)//혹은 조건문 자리에 info 대신 a.getAllInformation() 이 들어가도 된다

System.out.println( i+1+"번째정보"+info[i]);

와 같이 이용하면 된다. 


==================================


다형성 구현을 가능하게 하는 OverLoading


다형성은 하나의 인터페이스를 다양하게 동작하도록 하는 객체지향 프로그래밍의 특징이다.

OverLoading 은 같은 메서드 이름으로 인자값에 따라 다르게 작동하는 작동법이다.


사용자 입장에서 하나의 메서드만 기억하면 실행시킬 수 있기 때문에 조작이 쉽다.


우리가 더하기를 할 때에 1+1 = 2 이지만 1.0 + 1.0 =2.0 이라고 한다. 

정수 덧셈을 하라든가 실수 덧셈을 하라고 주문하지 않았지만 답을 낼 때에 위와 같이 한다.

하지만 두 더하기를 전달하는 방법은 "더하세요"라고 말하면 된다.


다형성도 마찬가지이다. 메서드 명을 입력해 "실행하세요"라고 하면, 1이 들어왔을 때에는 2라고 출력하고, 1.0이 들어왔을 땐 2.0으로 출력하는 것이다

더하기 라는 하나의 인터페이스를 다양하게 활용하는 것이다.


================================


getter 메서드 개념에는 객체의 상태attribute가 Encapsulation 되어있다는 개념이 포함되어있다.

getter메서드는 객체의 상태를 행위를 통해 return 받는 것을 말한다.


만일 이 때 bean class의 field가 encapsulation(되지 않았다면 .오퍼레이터를 이용해 직접 상태에 접근하는 것을 막을 수 없다.

정보 공개를 막을 수 없다는 것이다.


그러나 field의 접근제한자를 private로 입력하면 직접적으로 정보를 가져오는 것은 불가능하며 getter메서드가 있어야만 가능하다.

만일 private처리 된 필드를 .오퍼레이터로 가져오려 한다면 컴파일에러가 발생한다.

행위를 통해 접근할 수 있도록 한다는 것은 제한이 가능하다는 뜻이다.

전달받는 인자에 따라 출력을 다르게 함으로서 정보를 공개하는 조건을 입력할 수 있기 때문이다.


===============================


2019/03/17 - [IT/JAVA 공부] - [JAVA] call by value/reference, 배열, 객체지향

2019/03/04 - [IT/JAVA 공부] - [JAVA] 연산자, 주석문, switch, for, while, 배열

2019/03/03 - [IT/JAVA 공부] - [JAVA] Class path, Byte code, Data type, Operator

2019/02/27 - [IT/JAVA 공부] - [JAVA] system 개발 절차, "플랫폼 독립적"의 의미, 환경변수 잡는 이유