본문 바로가기

카테고리 없음

자바 객체지향의 개념과 클래스

객체지향 프로그래밍은 Object Oriented Programming OOP라고 불린다.

객체지향 프로그래밍은 단순히 명령어의 목록으로 보는 시각에서 벗어나서 독립된 객체의 단위로 파악하고자 하는 것이다. 객체는 메세지를 주고받고, 데이터를 처리할 수 있다. 이 말을 조금 더 풀이를 하자면

프로그램을 객체라는 기본 단위로 나누고 객체들의 상호작용을 서술하는 방식이다.

객체는 단순한 데이터 묶음이 아니다. 하나의 역할과 메소드와 데이터의 묶음으로 봐야한다.

객체지향 프로그래밍을 이해하기 앞서서 C언어를 먼저 살펴보자 C언어는 굉장히 오래된 언어이고 굉장히 전통성이 있는 프로그래밍 언어 중 하나이다. C언어는 1972년 미국 벨 연구소 Dennis Ritchie가 새로운 버전의 유닉스를 개발하기 위한 목적으로 만들어 졌다. 이후 절차적 프로그래밍 언어인 C언어에서 확장을 하여서 Bjarne Stroustrup이 C++을 개발하여 1985년 c++가 출시가 되었다. C언어를 기반으로 하는 C++은 속도나 효율성 저항이 없이 c언어를 개선 함과 동시에 이전에 C언어의 구조체를 사용하던 절차적 프로그래밍에서 c++에서 클래스를 사용하여서 절차지향적 프로그래밍에서 객체지향 프로그래밍 언어로 프로그래밍의 개념은 이전 보다 확장이 되었다. 객체지향 프로그래밍은 명령어를 하나로 묶어서 객체라는 단위로 조합하고 조립단위를 만들고 마치 하나의 레고 및 퍼줄을 끼워 맞추듯이 프로그래밍을 하는 듯한 느낌을 준다.

객체지향 프로그래밍에서는 객체간의 상호작용 객체는 어떠한 상태와 행위를 하는지 생각하는 것이 상당히 중요하다. 이는 UML 다이어 그램 중에서 class 다이어그램을 설계를 할 떄에도 마찬가지이다.

위에서 객체지향 프로그래밍은 '객체간의 상호작용 상태와 행위' 등을 나타낸다고 하였다. 그렇다면 우리가 영어로 Object라는 단어를 구글에 검색을 하였을 때 어떤 이미지가 나오는지 보자

영어로 명사와 목적어의 설명

 

Object하면 영어를 어렸을 적 공부했을 때 지겹도록 했던 1형식 2형식 3형식 등을 지겹도록 외운 경험이 있을 것이다. s v ,s v o, s v io do 등등.......Object는 목적어 어떤 물체 목표 등을 영어로 뜻하는 단어이다.

Subject는 명사 등으로 주체가 되는 뜻을 뜻한다. 아마 이 또한 중 고등학교에서 지겹도록 공부를 했었을 것이다.

객체는 = Object이고 위의 해석과 같이 사람 혹은 사물 어떠한 행동과 행위를 받는 것 행위를 하는 주체의 목적이 될 수 있다.

위의 영어에서 티나는 피아노를 친다. 노란색 밑줄을 친 부분이 목적어 피아노이다. 피아노는 티나라는 주체가 행하는 동작을 받는 하나의 물건이다. 즉 이것이 객체이다. 이러한 객체를 추후에 어떻게 객체를 프로그램에서 생성을 하고 생성한 객체를 클래스의 메서드에서 객체가 행위를 받는지 조금 더 설명을 해보겠다.

많은 프로그래밍 랭귀지 그 밖의 수학 학문들이 외국에서 영어로 넘어 오는 경우가 많기 때문에 영어를 이해한다면 프로그래밍 및 수학 엔지니어링 영역에서 다른 부분을 공부 할 때 이 용어가 왜 이렇게 지어지고 용어가 같는 의미를 조금 더 깊게 이해를 할 수 있게 된다.

사담은 집어치우고 우리가 앞으로 배울 OOP에서는 객체가 어떻게 메서드에서 행위를 받고 메서드를 정의를 하고 이는 객체와 어떻게 상호작용을 하는지에 대해서 조금식 알아 보겠다.

 

클래스 다이어 그램의 예시

클래스 다이어그램에 대해서 공부를 해보고 싶은 사람이면 한번 들어보길 바란다.

위와 같이 고객이라는 클래스를 정의를 하고 위의 customerName, address, email, creditCardInfo등등.. 이와 같은 것은 고객의 속성이다. 고객의 속성은 고객의 이름, 고객의 주소, 고객의 이메일과 같은 것으로 구성을 할 수 있다. 또 클래스에서 register(), login()과 같은 것을 메소드라고 한다.

자동차 클래스의 위는 필드 아래는 메서드

그렇다면 이렇게 자동차라는 클래스가 있다고 치면 우리는 자동차의 속성과 행위를 표현 할 수 있다.

자동차는 회사 , 모델 과 같은 속성을 가질 수 있고 자동차는 가속, 브레이크와 같은 행위를 가질 수 있다. 이렇게 클래스 다이어그램에서 현실에서 존재하는 객체를 설계하는 것을 객체 모델링이라고 한다. 이렇게 속성과 행위를 정의 하는 것을 필드와 메서드로 정의한다고 한다.

클래스 간의 관계를 표현하는 방법

크게 6가지로 분류를 해보자 연관 관계, 의존 관계, 일반화 관계, 실체화 관계, 포함 관계, 집합 관계으로 우선 분류를 해보자 그렇다면 클래스간의 관계에서 이는 어떠한 의미를 나타내는지 개념을 알아 보자

연관 관계

연관 관계

NBA라는 클래스가 존재하고 Golden state worriers라는 미국 NBA리그 소속의 골든 스테이츠 워리어스를 예를 들어 보자 골든 스테이츠 워리어스는 NBA라는 미국 농구 리그의 산하에 소속 되어 있는 하나의 농구 팀이다. 우리는 바로 골든 스테이츠 워리어스는 NBA의 팀이라고 알 수 있듯이 2개 이상의 사물이 서로 연관이 되어 있는 상태를 표현 하고자 할 때에 저렇게 표현을 하고 우리는 연관 관계에 있다라고 표현을 한다.

 

 

의존 관계

의존 관계는 이렇게 점선으로 표시가 가능 하며 사물 즉 객체사이에서 아주 짧은 시간에만 연관을 유지하는 관계를 표현 한다. 사물이 영향을 받는 쪽으로 표시를 한다.

때로는 상속 관계라고도 일컫는다. machinesystem이라 하면 자동차와 기차에 비해서는 더 큰 개념이다.

하나의 사물이 얼마나 더 구체적인지 부모 개념을 상위 개념이라 하고 아래를 자식 개념이라 한다.

 

.

포함관계

포함관계는 한 집합이 다른 집합에 모두 속하는 관계라고 할 수 있다.

엔진에 피스톤과 플러그는 또하나의 부품이고 반대로 자동차를 예를 들면 엔진은 자동차의 포함이 된 관계이다.

 

 

 

집합 관계

하나의 객체에 여러 개의 독립적인 객체의 구성관계를 나타낸 다이어그램이고

차라는 클래스가 엔진과 바퀴의 부모라는 것을 나타낸다 즉 차와 엔진 바퀴가 독립적이지 못하고 배타적이지 않다는 것을 강조한다.

실체화 관계

추상 클래스나 인터페이스등을 상속을 받고 자식 클래스가 추상 메서드를 구현을 할 때에 사용을 한다.

서로 해야하는 기능등을 그룹화를 하였다고 볼 수 있다.

 

 

캡슐화 : 클래스 내부 변수 및 메소드를 하나로 패키징을 하는 기술을 캡슐화라고 한다.

객체에 선언된 변수나 메소드가 구분없이 중구난방으로 접근할 수 있다면 정상적인 객체로 보기 어렵다.

캡슐화=정보 은닉

응집도는 높이고 결합도는 낮은 것이 좋음

묘듈화가 잘 이루어져있을 경우 모듈 단위 재사용이 용이해진다.

캡슐화를 알기 이전에 접근제어자를 알아야함

자바의 접근 제어자 : public, protected, default, private

---------------------------------------------------------------------------------------------------------

public class B{

	private void publicMethod(){
    	System.out.println("public 메소드 접근");
    }
    default void defaultMethod(){
    	System.out.println("default 메소드 접근");
    }
    protected void protectedMethod(){
    	System.out.println("protected 메소드")
    }
    private void privateMethod(){
    	System.out.println("prviate 메소드 접근")
    }
 }

-------------------------------

-----------------------------------------------------------------------------------------------------------------------------------

public은 다른 객체에서 해당 객체의 인스턴스를 생성하여 접근이 가능하다.

위와 같이 B클래슬 만든 후 메인 메소드에서 객체를 생성하고 클래스 b의 메소드에 접근해서 호출이 가능하다.

public class A extends B{
	public void run(){
    	protectedMethod();
    }

}

 

protected는 상속을 받은 클래스에서 해당 부모 클래스의 메서드를 상속 받을 수 있는 권한을 줄 수 있는 것이다.

해당 B클래스의 protectedMethod();를 호출 가능하다.

-------------------------------------------------------------------------------------------------------------------------------------

 

 

 

public class A{
	public void run(){
    	B b = new B();
        b.publicMethod();
    }

}

 

default는 동일한 패키지 내에서만 접근할 수 있다.

private은 반드시 선언된 객체 내부에서만 접근이 가능하다.

추상화는 공통된 속성이나 기능을 묶어 이름을 붙이는 것이다. 데이터의 공통된 성질을 추출하여 슈퍼 클래스를 선정을 하는 것이다. 불필요한 정보는 숨기고 중요한 정보만 표현을 하는 것 프로그램을 간단하게 만드는 것이다.

상속 : 상위 클래스가 하위 클래스에게 물려주고 하위 클래스가 상위 클래스의 속성 및 행위 메소드를 쓸 수 있게 가져 올 수 있다.

다형성 : 하나의 객체가 여러가지 타입을 가질 수 있음을 의미한다.

자바에서 패키지는 클래스를 식별해 주는 용도이다.

 

패키지는 상위 패키지에서 하위패키지 구분이 되고 도트(.)으로 접근이 가능하다.

 

 

----------------------------------------------------------------------------------------------------------------------------------------

 

main페키지 안에 main 함수가 있고 pk1안에 car그리고 pk2안에 car클래스가 각각 존재함

위와 같은 방식으로 week03파일밑에 packageExample파일 pk1 패키지안의 car 클래스를 불러올 수 있다.

따로 import 해오는 방법도 존재 한다.