날아라쩡글이의 블로그입니다.

객체 지향 언어 본문

중앙 HTA (2106기) story/java story

객체 지향 언어

날아라쩡글이 2021. 9. 6. 18:58
반응형

객체 지향 언어 프로그래밍에서는 생소한 단어들이 많이 나올 예정이다. 

  • 객체 지향 프로그래밍이라는 것은 객체를 만들고 조립하여 시스템을 만드는 것이다.
  • 프로그램, 즉 카메라라는 물건을 만들게 되면 한덩어이르이 장치가 아닌 카메라, 디스플레이, 연산처리등 여러가지 부품들이 필요하다는 사실을 할 수있다. 하나의 어플리케이션을 만드는 것도 마찬가지로 여러개의 부품을 만들어서 조립한다고 할 수 있다. 
  • 개별 부품들은 객체라고 부른다. 객체를 가르키는 말로 컴포넌트 , 모듈이라는 단어가 있다. 
  • 용어를 떠나서 객체를 여러가지로 모아서 소프트 웨어를 만드는데 이렇게 만든 객체를 합치기 위해서는 설계도가 필요하다. 그 설계도의 이름은 클래스라고 한다. 
  • 설계도를 만들고, 메모리안에 만들어 놓은 것을 객체라고 하며, 메모리내에 생성하게 만드는 것 -->인스턴스 화라고 한다. 

객체지향프로그래밍 언어의 주요 장점

  • 객체간의 서로의 관계는 의존, 집합, 상속등이 있다. 
  • 개체지향프로그래밍의 경우 코드의 재사용성이 높다. -->새로운 코드를 작성할 때 기존의 코드를 이용해서 쉽게 작성할 수 있다. (상속)
  •  
    마우스가 고장이 난 경우 --> 새로운 마우스를 꽂으면 됨. 그것처럼 상속이 되는 부분을 다시 연결하면 된다. 코드의 관리가 용이하다는 뜻으로 유지보수가 쉽다는 의미이다. 그와 같이 코드간의 관계를 이용해서 적은 노력으로 쉽게코드를 변경 할 수 있다. 
  • 마우스가 용접이 되어있으면 서로 간의 관계가 타이트 하기 때문에 마우스가 고장나면 수리가 어렵다는 단점이 있다 ( 유지보수의 어려움) , 객체간의 결합도가 높다는 말이다. 
  • 에어팟을 에어팟프로로 교체가 가능한 것처럼 교체가 쉬운데 ---->이처럼 객체 관계는 결합도가 낮게, 응집력이 높도록 만들어야한다. 
  • 신뢰성이 높은 프로그래밍을 가능하게 한다.  접근제어자와 메소드를 이용하기 때문에 객체 상태를 사용자나 누구든지 임의로 변경하는 것을 막아준다. 이를 캡슐화와 은닉화라고 하는데, 데이터의 변경이 자주있게 되면 프로그래밍이 신뢰성이 높지않다고 말할 수 있다. 
  • 객체의 내부상태는 임의로 변경이 불가능하며, 유효한 값인지 체크를 하는 기능을 이용해야한다. 
  • 코드의 중복을 제거하고(중복제거 ) 코드의 불일치로 인한 오작동을 방지할 수 있다. (리펙토링)

근래의 프로그래밍언어의 방식은 이를 따라서 만들어진다고 볼 수 있다. java, c++, python --> 구현방식은 다르지만 기본적인 개념은 유사하다. 

객체지향 프로그래밍의 주요 특징으로는 총 세 가지가 있다. 

  1. 캡슐화 (Encapsulation)
    • 객체의 실제 구현내용을 감추는 것이다. 
    • 다른 객체는 객체의 내부구조를 알 수 없고, 공개된 속성과 기능만을 이용할 수 있다. 
    • 잘못된 사용으로 인한 객체의 손상을 방지한다. 
    • 자바는 접근제한자를 사용해서 공개 할 것인지, 숨길 것인지 결정할 수 있다. 
    • EX) 자동차 객체에 대해서 생각을 하자면, 자동차의 경우 다양한 기능이 있다. 엔진 경우 높은 속도 까지 올라갈 수 있으며, 여러기능이 있지만 운전자에게는 노출시키지 않는다. 이유는 엔진을 연속해서 최대로 높일경우 엔진이 폭팔되거나,잘못된 사용으로 객체의 손상이 가는 것을 방지하기 위해 공개된 속성만 사용하도록 임의로 정해놓은 것이다. 
  2. 상속(Inheritance)
    • 새로운 객체를 만들 때 상위 클래스에서 구현한 것을 하위 클래스에서 사용하고, 하위클래스의 경우 스스로에 대한 것만 구현하는 것을 말한다. 
    • 상위클래스를 재사용하기 때문에 하위 클래스를 빠르게 개발할 수 있다. 
    • 상위클래스를 상속받아서 다양한 프로그램의 요구에 대응할 수 있는 하위 클래스를 개발할 수 있다. 
    • 상위클래스와 하위 클래스는 종속 관계를 형성함으로써 클래스들을 조직화 할 수 있다.
  3. 다형성(Polymorphism)  =  추상화라고 불린다. 
    • 같은 종류의 객체를 사용하는데 , 실행결과가 다르게 발휘되는 것을 의미한다. 
    • 같은 종류의 사용방법을 사용하지만, 실제로 사용하는 객체가 바뀌면 실행결과가 다르게 나타날 수 있는 것을 의미한다. 
    • Ex) 컴퓨터에서 인쇄라는 출력기능을 사용을 하는데 --> 프린터기가 흑백인지 컬러인지에 따라서 출력물이 다르게 나타날 수 있다는 것이다. 
    • Ex) 스마트폰의 노래듣기 : 스마트폰의 음악듣기 버튼을 누르지만, 이어폰 객체를 사용하면 나만들을 수 있고, 스피커 객체를 사용하면 같은 공간의 모든사람들이 노래를 듣는 것이다. 

객체

  • 물리적으로 존재하거나 추상적으로 생각할 수 있는 것이며, 다른 것과 식별이 가능한 것이다. 
  • 물리적으로 존재하거나 추상적으로 생각하는 것이 프로그래밍의 대상이다. 
  • 물리적으로 존재하는 것은 -- 자동차,  TV, 책, 상품등을 말할 수 있다. 
  • 추상적으로 존재하는 것은 -- 개설과정, 계좌 , 주문 등을 말할 수 있다. 
  • 객체는 자신의 고유한 속성(값)과 기능을 가지고 있다. 
    •  자신의 고유한 속성의 경우 다른 객체와 구별할 수 있는 객체가 가지고 있는 정보를 의미한다.
    • 기능이란 실제로 행동할 수 있는 것을 의미한다 
    • 예를 들면 
    • 자동차의 경우 
      • 고유한 속성의 경우 제조사, 모델명, 가격, 최고속도 등 다른 자동차와 구분이 가능한 것을 의미한다. 
      • 기능의 경우 고유기능인 부분으로 출발기능, 정지기능, 운정기능을 의미한다.
    • 주문의 경우 
    • 속성의 경우는 주문번호, 고객명, 날짜를 의미하고 
    • 기능의 경우 조회, 취소, 반품하기를 말할 수 있다. 
  • 속성의 경우는 다른 객체와 확연히 구분될 수 있는 부분을 의미하고 , 기능의 경우는 실제로 할 수 있는 부분을 의미한다. 공통적으로 갖고 있는 속성을 이야기 할 수 있다. 
  • 현실세계에서 사람의 속성은 이름, 나이이며, 동작의 경우는 웃다. 먹다. -->이를 객체로 분석해서 도출(소프트웨어 객체 모델링) 한다면, 사람의 속성의 경우 필드라고 하며, 동작하는 부분은 메소드라고 한다. 
  • 즉, 속성 (값) =  필드, 기능 (행위) = 메소드
  • 현실의 정의하려는 것이 프로그램의 대상이기 때문에 현실의 객체를 소프트웨어의 객체로 모델링하는 것이다. 
  • 객체는 클래스(설계도)로 메모리내에 실제로 만들어지는 것을 인스턴스 화라고 한다. 객체는 인스턴스라고 하며, 메모리에 실제로 생성하는 것은 인스턴스 화라고 한다. 

객체 간의 관계 

  • 사용관계의 경우 의존관계이다. 객체간의 사용작용을 의미하며, 객체가 다른 객체의 메소드를 호출해서 원하는 작업을 수행하는 것을 의미한다. 운전기사가 자동차가 없으면 일을 못하는 것처럼 상속관계를 의미한다. 
  • 상속관계란 상위객체를 기반으로 하위객체를 생성하는 관계이다. 조상관계라고도 한다. 상위객체는 기계라는 폭 넓은 의미로 조상의 형태이거 , 자동차객체는 구체적인 사물에 해당된다. 핸드폰으로 비교할 경우 스마트폰이 조상객체이고 iphone7이 하위객체를 의미한다. 
  • 집합관계, 포함관계란 객체가 다른 객체의 부품으로 사용되는 관계를 의미한다. 

클래스 

  • 객체는 설계도를 바탕으로 만들어진다. 
  • 자바의 객체에 대한 설계도는 클래스라고 한다. 
  • 클래스는 객체생성을 위한 필드와 메소드로 구성이 된다. 필드의 경우 객체의 속성을 의미하고 메소드의 경우 객체의 기능을 의미한다.
  • 객체는 인스턴스라고 불리며 객체를 생성하는 과정을 인스턴스화라고 한다. 

객체지향프로그래밍 개발단계 

  • 1. 클래스를 설계한다. 
  • 2. 클래스로 객체를 생성한다.(필드, 메소드를 만든다. )
  • 3. 생성된 객체의 속성과 기능을 이용한다. 

하나의 클래스로 여러개의 객체를 만들 수 있다. 

똑같은 핸드폰 객체지만, 본인의 폰인 것을 구별하는 방법이 --> 색상, 케이스, 바탕화면이 다른 부분이 있을 텐데, 그와 동일하게 동일한 성격을 가진 객체가 여러가지지만 객체의 필드(속성)과 상태를 통해서 다르다는 사실을 알 수 있다는 것이다. 동일한 폰이지만 속성이 '다름' -->어플 , 상태, 바탕화면, -->그래서 구별이 가능하다는 것이다. 

하나의 설계에 따라서 여러개의 객체를 만들 수 있다. ->속성에 따라 구별

public class 클래스 이름{

}    으로 클래스를 작성할 수 있다.  class Car , class Book ,  class Order ---> 이와 같이 물리적이고 추상적으로 표현이 가능하다. 

  • Car라는 class를 사용하면 클래스로 표현할 수 있는 항목은 제조회사, 가격, 옵션을 표현할 수 있다. 
  • Book이라는 class를 사용하면 프로그램의 대상은 책표면 객체, 책, 저자, 절판여부 , 줄거리를 표현할 수 있다 .
  • Order이라는 class를 사용하면 표현할 수 있는 항목은 주문일자, 주문상태, 주문현황을 표현할 수 있다. 
  • 설계도는 제품을 만들어야 사용이 가능하다. 
  • 객체를 만들기 위한 명세서를 가지고 객체를 생성해야하는데 new연산자를 이용하여 객체 생성이 가능하다. new 클래스명();
  • new연산자를 사용하면 클래스를 메모리에 로딩을 하고, 객체가 생성되며 만들어진다. 객체는 메모리의 Heap 영역에 만들어진다. new연산자는 메모리의 힙영역에 객체를 생성한 후, 메모리내에서 객체의 위치를 알 수 있도록 객체의 주소값(메모리에서 객체가 위치하고 있는 주소를 반환한다. 
  • new 연산자의 역활은 
    1. 클래스로부터 객체를 생성할 수 있다. 
    2. 객체의 주소값을 반환한다. 
  • new연산자가 반환하는 주소값을 저장하기 위한 참조변수가 필요하다. 

변수 생성하기 

  • 저장할 값을 우선적으로 생각해야한다. 
  • //정수 10을 저장하는 변수 생성하기 
    • int a; 
    • a = 10;
  • //실수 3.14를 저장하는 변수 생성하기
    • double a;
    • a = 3.14;
  • //고객이름 "홍길동"을 저장하는 변수 생성하기
    • String a;
    • a = "홍길동";
  • //Book 객체의 주소값을 저장하는 변수생성하기 
    • Book a = new Book();
    • Book이라는 클래스로 생성된 객체의 주소값을 담을 참조 변수 a로 반환한다.
  • //Car 객체의 주소값을 저장하는 변수 생성하기 
    • Car a = new Car();
    • Car이라는 클래스로 생성된 객체의 주소값을 담을 참조변수 a로 반환한다. 
  • // Order객체의 주소값을 저장하는 변수를 생성하기 
    • Order a = new Order();
    • Order이라는 클래스로 생성된 객체의 주소값을 담을 참조변수 a로 반환한다.. 
  • new연산자를 이용하여, 클래스로부터 객체를 생성하고, 객체의 주소값을 참조변수로 반환한다. 
  •  
    이런식으로 메모리 heap내에 생성이 된다. 
  • 참조변수의 경우 주소값을 갖는다. 그리고 각각 주소값이 변수내에 저장이된다. 
  • 객체 영역에 참조 주소값이 부여가 되는 것은 new라는 연산자가 쓰였을때 그리고 참조변수를 쓰는 순간 변수영역에 작성된다. Car a; 이렇게 쓴다고 생기는 것이아니다. 
  • 객체의 주소값을 저장하는 변수 타입에 맞는 변수를 적어주어야 하는데, Product a = new Car(); 이런 식의 호출은 안되는 것이다. 변수타입에 맞는 변수를 작성해주어야한다. 
  • 무조건 생성하는 변수와 주소값이 같은 객체 타입이여야 저장된다. (담긴다.)
  • 타 프로그래밍 언어는 변수가 생성될 때 그때 var a = new number();이런식으로 담을 수 있지만, 자바의 경우 타입이 미리 결정되어야한다.

생성된 객체의 속성과 기능 이용하기 

  • 참조변수가 참조하는 객체는 그 객체와 속성과 기능을 사용할 수 있다. 
  • 참조변수가 참조하지 않는 객체는 사용할 수 없다
  • 생성된 객체의 속성과 기능을 사용하기 위해서는 반드시 참조변수에 객체의 주소값을 저장해두어야 한다. 
  • class order의 경우 명칭이 호출되는 순간 JVM내에 설계도를 메모리에 로딩한다. 
  • Car myCar = new Car(); Car yourCar = new Car();처럼 동일한 설계도로 각각 객체생성이 가능하다. 서로 다른 객체의 형태를 가지고 있다. 사용하게 될 때에는 main메소드에서는 myCar(); yourCar();처럼 호출을 해주어야한다. 

참조변수를 통해서 간접적으로 속성값과 기능실행이 가능하다. 

클래스

  • 클래스란 객체를 생성하기 위한 설계도이다. 
  • 하나의 클래스로 여러가지 객체를 생성할 수 있다. 
  • 클래스의 구성 요소로는 
    1. 필드 (Field) = 객체의 데이터를 저장한다.속성을 담당하고 있는 고유한 값이다. 변수의 이름은 맴버변수라고 한다.
    2. 생성자 (Constructor) = 객체 생성시 초기화 역활을 담당한다. 클래스의 이름과 동일한 메소드이며, 다음 강좌때 배울 예정이다. 
    3. 메소드 (method) = 객체의 기능에 해당하는 수행문의 코드 블록이다. public void 형태로 각각의 수행문이 들어간다. 

필드

  • 객체의 고유데이터, 현재 상태정보, 부품객체를 저장하는 곳이다. 
  • 객체의 고유한 속성을 나타낸다. 
  • 변수와 비슷한 형태로 정의된다. 
  • 필드는 초기화값을 지정하지 않는 경우 해당 데이터타입의 기본값으로 초기화 된다. int는 0으로 double은 0.0으로 
  • 필드는 생성자와 메소드 전체에서 사용가능하다. 
  • 객체는 사라지지 않는다. 참조만 잘하면 유지가 된다. 
  • 고유한 속성을 가지고 있기 때문에 동일한 객체라도 필드가 다르면 다른 객체이다. 비슷한 형태로 정의가 될 수 있다. 
  •  

 

  • Book book1;
  • Book book2; --->참조변수를 선언하면 적는 순간 클래스 영역에 호출이 되며 생성이 된다
  • new 연산자를 작성하자마자 참조변수에 주소값을 반환하면서 객체영역에 주소값이 형성된다. 
  • 그리고 클래스에 필드로 작성하자마자 객체 영역에 맴버변수가 작성이 된다. 
  • 설계도에서 객체영역으로 연결이 되고 변수와 new연산자를 함께 사용하면서 참조변수와 객체영역에 주소값이 연결이 된다. 
  • 객체영역에 값을 생성하기 위해서는 .  (dot) 표시를 이용하여 호출하는 방식이 있다. a.menu = "고기"; 라고 작성하면 맴버변수에 데이터가 저장이 된다. 

객체 사용하기 

  • 클래스를 사용하면 사용자 정의 데이터 타입을 정의할 수 있다. 

프로그램의 대상이 되는 정보들

  • 학생정보 = 학번, 학과, 학년, 담당 교수, 이름, 계정 아이디, 비번, 휴학여부, 졸업여부 
    •           int    String int     String    String    String    String  boolean   boolean    
  • 계설과정 정보 = 개설과정번호, 학과, 과정명, 수강인원수, 담당교수, 강의실, 전공과목여부, 교양과목여부 
    •                   int              String String     int          String      String     boolean     boolean
  • 주문정보 = 주문번호, 주문자, 주문날짜, 주문상태 , 주문금액
    •              int       String    Date       boolean    int
  • 공연정보 = 공연명, 공연날짜, 공연시간, 공연장소, 공연가격, 출연자들
    •            String    Date      int          String      int         String[ ]
  • 시험정보 
  • 상품정보
  • 예매정보
  • 이 처럼 우리가 다루는 정보들이 여러종류가 합쳐져서 정보가 되는 것이다. 다양한 값이 와야한다
  • 만약 class의 필드를 호출해서 사용하지 않으면 여러번 반복해서 작성을 해야한다. 학생이 600명이상이라면 변수명도 부여하는 것도 일이다. 
  • Student class 내에도 정보를 갖고있는 객체를 만들 수 있다. 
  • Student class 에 생성된 객체는 학생정보를 저장하는 필드를 가지고 있는 객체이다. 
  • Student 객체를 하나 생성하면 학생정보 하나를 저장(표현)할 수 있다. 
  • 한사람의 학생정보는 student 객체 하나로 관리된다. 
  • 변수명 하나로 관리 된다. 

우리는 여행을 갈 때 캐리어에 물품과 여권들을 담아서 가지 손에 하나씩 들고가지는 않는다. 우리가 다루는 정보 또한 하나의 값이 아니다. 그래서 캐리어에 담아가기 때문에 객체를 생성하고, 또 다른 이유도 존재하지만 그래도 일단은 객체를 생성한다고 이해하면 된다. 

정보를 저장할 목적으로 사용되는 객체를 Value Object (VO) 라고 한다. 값을 가진객체라는 뜻이다. 또한 Data Transfer Object(DTO)라고 불린다 뜻은 데이터를 들고 다니는 객체, entity라고 불린다. 코딩을 시작하면 우선적으로 진행하는 것이 VO와 DTO를 만드는 것이다. 

학생 정보를 저장하자 

  • Student a ; //Student 객체의 참조값을 담을 수 있는 참조변수 a를 생성함. Student객체는 생성되지 않았음. 
  • a.name; -->객체의 주소값을 a에 저장하지 않았기 때문에 학생의 정보를 저장할 수 없음 error가 남
  • Student a = new Student(); //학생정보를 저장할 수 있는 Student 객체를 생성하고 그객체의 주소값을 a에 저장함.
  • a.name //참조변수 a로 Student객체를 사용할 수 있음

참조변수는 객체 자리를 만들어 주어야한다. new연산자로 객체를 만들어서 사용해야한다. 객체는 방이라고 생각하면 된다. 직접 넣는 것이 아닌 객체내의 맴버변수에 담아야한다. 객체의 구성요소로 포함이 되서 맴버변수로 정의해서 사용해야한다. 

클래스를 사용해서 내가 정하는 사용자 정의 데이터 타입을 정의할 수 있다. 

class의 구성요소로는 필드, 생성자, 메소드가 있지만 전부 사용해야하는 것이 필수는 아니다. 필드만 사용할 수 있다. 만들기 나름이다. 필드만 있으면 사용자 정의 데이터 타입을 정의할 목적으로 작성된것이라고 할 수 있다. VO, DTO로 사용된 것이다. 

모든 클래스는 main method를 가지는 것은아니다. 값을 정의하기 위해 만들어진 설계도 있기 때문에 꼭 main method를 가져야하는 것은 아니다. 

  • Score a ; // Score 클래스로 생성한 Score 객체의 주소값을 저장하는 참조변수 a를 생성함, Score 타입의 참조변수 a를 생성함.
  • new Score (); //Score클래스로 객체를 생성하고, 생성된 객체가 위치하고 있는 메모리의 주소값을 반환함.
  • Score a = new Score(); //Score 클래스로 객체를 생성하고, 생성된 객체가 위치해있는 메모리의 주소값을 Score타입의 참조변수 a에 대입함. 참조변수 a는 주소값에 해당하는 곳에 위치라고 있는 Score객체를 참조하기 시작함. 
  • Score b = a; // 참조변수 a에 저장된 주소값을 Score타입의 변수 b에 대입함. 참조변수 b도 참조변수 a가 참조하는 개체를 참조하게 됨.
  • a.name = "홍길동"; //참조변수 a가 참조하는 객체안에 위치한 name에 문자열 홍길동을 대입함.
  • a.kor = 100; //참조변수 a가 참조하는 객체안에 위치한 맴버변수 kor에 정수값 100을 대입함
  • int c = a.kor; //참조변수a가 참조하는 객체안에 위치한 맴버변수 kor에 저장된 값을 int타입 변수에 대입함
  • System.out.println(a.name);//참조변수 a가 참조하는 객체안에 위치한 맴버변수 name에 저장된 값을 화면에 출력함. 
  • 매번 데이터를 작성해야하지만 상속이나 필요데이터를 부모요소로써 사용할 수 있게 됨. 참조변수만 알고 있으면 됨. 

배열

  • //정수 3개를 저장할 수 있는 배열 만들기 int[] a = new int[3];
  • //실수 3개를 저장할 수 있는 배열 만들기 double[] a = new double[3];
  • //문자열 3개를 저장할 수 있는 배열만들기 String[] a = new String[3];
  • // 성적정보 3개를 저장할 수 있는 배열만들기 Score[] a = new Score[3];
  •  
    배열의 경우 주소값이 담기게 되는 곳이 생성된다. 
  • Scores[0] = Score1;---> 참조하기 시작한다. 
  • Scores만 있으면 객체는 연결관계기 때문에 불러낼 수 있다. 
  • 이름이 여러가지라면 복잡하지만 하나의 이름으로 조절하는 것이 굉장한 이점으로 작용한다. 
  • 배열문을 출력하는 방법은 두가지가 있다.
    1. 하나하나씩 출력한다.
    2. for문을 이용하여 출력할 수 있다(향상된 -for문과 그냥 for문으로) 향상된 for문이 깔끔하고 좋다.
      변수 영역에 있는 일반 변수의 경우 stack에 저장되어 있기 때문에 쓰레기값이 저장될 확률이 있어 항상 초기화를 해주어야한다. 그러나 heap영역에 저장되는 객체영역에 있는 배열의 경우 자동으로 초기화가 되어 따로 초기화를 하지않고 사용할 수 있다.

2차원 배열의 경우 같은 데이터 타입 밖에 담을 수 없어 학생이름 까지 데이터 출력을 원한다고하면 진행을 할 수 없다는 단점을 가지고 있다. 그러나 사용자정의 class를 이용하게 되면, 내가 원하는 값으로 데이터를 표현할 수 있고, 값들을 List, class에 주면 쉽게 전달이 가능하여 효율적으로 이용할 수 있다. 

 

반응형

'중앙 HTA (2106기) story > java story' 카테고리의 다른 글

생성자 (constructor)  (0) 2021.09.09
메소드  (0) 2021.09.08
배열  (0) 2021.09.03
Array문  (0) 2021.09.02
내포된 if 문, switch문,Scanner, Break, Continue  (0) 2021.09.02
Comments