수업기록(2022-07~2022-09) JAVA

20220809 수업기록

연삐 2022. 8. 10. 18:58

08-09(화) 수업진도
1.객체지향프로그래밍
-객체
-특징
-객체와 클래스

2.Class
-구조
-생성자
-생성자overloading
-실행클래스 라이브러리클래스
-this.

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

객체 중심으로 코딩하는 프로그래밍.컴퓨터가 수행하는 작업을 객체들 간의 상호 작용으로 표현한다.
프로그래밍에 관련된 객체들을 먼저만들고 하나씩 조립해 완성된 프로그램을 만드는 기법.
 과거엔 객체지향프로그래밍을 사용하다가 실세계의 일을 보다 쉽게 프로그래밍 하기위한 객체중심의 객체지향언어가 탄생하게 됨. 컴퓨터 산업 발전에 따라 소프트웨어의 생명주기가 단축되었는데, 객체지향언어로 소프트웨어재사용을 하며 소프트웨어의 생산성을 향상시켰다.
💻절차지향프로그래밍
- 작업 순서를 표현하는 컴퓨터 명령집합
- 함수들의 집합으로 프로그램 작성

단점
-flow chart상에서 특정 부분을 수정할 경우 전체 프로그램 중에 다른 부분도 같이 수정해야만 한다.
-서로 다른 개발자가 커뮤니케이션하면서 코딩해야해서 의사소통하는데 시간이 많이 소요된다. (커뮤니케이션 오류 발생 가능)
-간단한 특정소프트웨어를 개발하여도 최소개발자가 3명이상 필요하여 인력이 많이 쓰인다.
-과거에 코딩했던 소스코드를 재활용하기가 매우매우 어렵다.
💻객체지향프로그래밍
-프로그램을 실제 세상에 가깝게 모델링
-컴퓨터가 수행하는 작업을 객체들 간의 상호 작용으로 표현
-클래스(혹은 객체)들의 집합으로 프로그램 작성

장점
-객체지향언어에 상속,다형성, 객체, 캡슐화 등 소프트웨어 재사용을 위한 여러장치가 내장되어 재활용 및 유지보수가 용이하다.
-상속을 통해 코드재사용성을 높일수있다
-독립적인 객체를 사용함으로써 개발의 생산성을 향상시킬 수 있다.
-캡슐화를통해 유지보수의 우수성이 높다


절차지향 프로그래밍 예시
객체지향 프로그래밍 예시

객체(Object)

  • 물리적으로 존재하는 것 ( 자판기엔진, 버튼, 돈통, 디스플레이)
  • 추상적인 것 중(주문내역확인, 버튼on/off)에서 자신의 속성과 동작을 가지는 모든것 
  • 객체는 필드와 메소드로 구성된 자바객체로 모델링가능
[자판기엔진]
[속성]
음료메뉴
받은금액
[동작]
음료주문을확인한다
재료의 재고를 확인한다
음료를 제조한다
객체를 [자바] 로 모델링
객체 : 자판기엔진
필드 : 음료메뉴 받은금액
메소드 : 주문내역확인한다
재료의 재고를 확인한다
음료를 제조한다

객체의 상호 작용

  • 객체들은 서로 간에 기능(동작)을 이용하고 데이터를 주고 받는다.
  • 객체지향프로그램에서는 객체는 다른 객체와 관계를 맺는다
    • 집합관계 : 완성품과 부품의 관계 ({돈통,물통,커피통,프림통,컵통} -> 자판기객체)
    • 사용관계 : 객체가 다른 객체를 사용하는 관계 (버튼객체 -> 자판기엔진객체 )
    • 상속관계 : 종류객체와 구체적인 사물객체 관계 

특징

  • 캡슐화
    • 메소드와 데이터를 클래스 내에 선언하고 구현
    • 외부에서는 공개된 메소드의 인터페이스만 접근 가능 
    • 객체 내 데이터에 대한 보안, 보호, 외부 접근 제한
    • 객체의 필드,메소드를 하나로 묶고 실제 구현 내용을 감추는 것
    • 외부객체는 객체내부구조를 알지 못하며 객체가 노출해 제공하는 필드와 메소드만 이용가능
    • 캡슐화를통해 외부의 잘못된 사용으로 인해 객체가 손상되지 않는다.
    • 자바언어는 캡슐화된 멤버를 노출시킨 것인지 숨길것인지 결정하기 위해 접근제한자를 사용한다. 
  • 상속
    • 상위객체의 필드와 메소드를 하위 객체에게 물려주는 행위
    • 하위객체는 상위객체를 확장해서 추가적인 필드와 메소드를 가질 수 있다.
    • 상속대상 : 필드와 메소드
    • 상위객체를 재사용해서 하위객체를 빠르게 개발 할 수 있다.
    • 반복된 코드의 중복을 줄일 수 있다.
    • 유지 보수의 편리성을 제공한다.
    • 객체의 다형성을 구현한다.
  • 다형성
    • 동일한 이름의 기능이 서로 다르게 작동하는 형상
    • 자바경우 >> 메소드 오버로딩 / 생성자 오버로딩 / 메소드오버라이딩 (상위클래스가 가지고있는 메소드를 하위클래스가 상속받아 메소드를 재정의해서 사용하는것을 말한다)
    • 같은 타입이지만 실행 결과가 다양한 객체를 대입할 수 있는 성질 
    • 객체를 부품화 시키는 것이 가능하다.

객체와 클래스

클래스에는 객체를 생성하기 위한 필드와 메소드가 정의된다.
클래스로부터 만들어진 객체를 해당 클래스의 인스턴스(instance)라고 한다.
하나의 클래스로부터 여러 개의 인스턴스를 만들 수 있다.

 

개발자  설계
>>
클래스(설계도)
(필드,메소드)
인스턴스화>> 인스턴스1 (객체)
인스턴스2 (객체)

 

클래스

- 객체의 속성과 행위 선언
 (속성 : 필드 / 행위 : 메소드)
- 객체의 설계도 혹은 틀
객체

- 클래스의 틀로 찍어낸 실체
- 메모리 공간을 갖는 구체적인실체
- 객체와 인스턴스는 같은뜻
[클래스]
붕어빵틀
[객체]
김치붕어빵
팥붕어빵
크림붕어빵

 

[클래스]
커피

[필드]
커피이름
커피가격
커피칼로리

[메소드]
아이스 / 핫
[인스턴스1]

[필드]
카페라떼
6000
120

객체 :  카페라떼
[인스턴스2]

[필드]
아메리카노
5000
60

객체 : 아메리카노
[인스턴스3]

[필드]
바닐라라떼
6000
200

객체 : 바닐라라떼

 


2.Class 클래스

객체의 설계도 혹은 틀

클래스의 구성

(클래스접근권한 / class / 클래스이름)
public class Coffee {
(필드)
       public coffeeName;
       public coffeePrice;
       public coffeeCal;
(생성자)
       public Coffee(){
       }

       public Coffee(String coffeeName){
             this.coffeeName = coffeeName;
       }
(메소드)
       public String getCoffeeName(String coffeeName){
          this.coffeeName = coffeeName

}

생성자 (Constructor)

  • new 연산자에 의해 호출되어 객체의 초기화를 담당  new 클래스(); 
  • 필드의 값 설정
  • 메소드를 호출해 객체를 사용할 수 있도록 준비하는 역할 수행
    • 기본생성자 (Default Constructor)
      • 모든 클래스는 생성자가 반드시 존재하며 하나 이상 가질수 있다.
      • 생성자 선언을 생략하면 컴파일러(JVM)은 다음과 같은 기본 생성자를 추가한다
소스파일(Coffee.java) >>>>> 바이트 코드 파일(Coffee.class)
public class Coffee {

}
public class Coffee{
       public Coffee(){   }  //기본생성자 자동추가
}

 

메인메소드가 있는 실행클래스
(데이터타입  변수명 = new 클래스이름(매개변수);
Coffee coffee = new Coffee () ;   <<  기본생성자 (매개변수가없음)

//생성자선언
//디폴트생성자(기본생성자)대신 개발자가 직접 선언
//클래스(매개변수){ //객체의초기화코드} -> 생성자블록

public class Coffee{
	String name;
    int price;
    
    Coffe(String name, int price){
  		this.name = name;
        this.price = price;
    } 
 }
//매개변수와 필드명이 같은 경우 this 사용
public Coffee(String name){
	this.name = name;
}
개발자가 선언한 생성자가 존재시 JVM은 기본 생성자(디폴트생성자)를 추가하지 않는다.
Coffee americano = new Coffee("아메리카노",3000);
new 연산자로 객체 생성시 개발자가 선언한 생성자 반드시 사용 Coffee(String name, int price){..}
//필드초기화
//초기값없이 선언된 필드는 객체가 생성될때 기본값으로 자동설정된다.
//int -> 0, double->0.0, String null .....
coffee = new Coffee();  // name = null , price = 0
//생성자의 매개값으로 초기값 설정 Coffee(String name, int price)
Coffee latte = new Coffee("라떼",5000);
Coffee caramel = new Coffee("카라멜마끼아또",6000);
객체 생성 과정 예
1. 객체에 대한 레퍼런스 변수 선언 latte
2. heap memory에 new Coffee 객체를 생성하고  객체참조주소가 생성된다.
3. Coffee class의 생성자 coffee(String name, int price) 호출하여 name에 "라떼", price에 5000 값을 할당한다 (초기화)
4. 1번에서 생성된 참조 주소값을 latte에 넣어 줌 

 


 

생성자 오버로딩 overloading

  • 메소드오버로딩과 같은 뜻으로 매개변수의 타입, 갯수 , 순서가 다른 같은이름의 생성자를 여러개 선언하는것을 말한다. (시그니처)
public class Coffee{
	String name;
    int price;
    
    //생성자 오버로딩 (Overloaing)
    public Coffee(String name){
    	this.name = name;
    }
    
    //생성자 이름은 같지만 시그니처는 다르다.
    public Coffee(String name, int price){
    	this.name = name;
        this.price = price;
    }
}
//다른생성자 호출(this())
//생성자 오버로딩되면 생정자 간의 중복된 코드가 발생된다.
//초기화 내용이 비슷한 생성자들에서 이러한 현상이 많이 발생된다.
//   1. 초기화 내용을 한 생성자에 몰아 작성
//   2. 다른 생성자는 초기화 내용을 작성한 생성자를 this(...)로 호출.

public class Coffee{
	String name;
    int price;
    
    //카페가격은 최저가격이 4500원이라는 가정하에
    public Coffee() {
    	this("커피이름을입력해주세요",4500); 
    }
   
    public Coffee(String name){
    	this(name,4500); 
    }
 
 	public Coffee(int price){
    	this("커피이름을입력해주세요",price);
    }
    
    public Coffee(String name, int price){
    	this.name = name;
        this.price = price;
    }
}
1-3번째 생성자는 초기화내용을 몰아 작성한 4번째 생성자를 호출했다. 

 

실행클래스 라이브러리클래스

  • 실행클래스 : main메소드가 있는 클래스
  • 라이브러리 클래스 : filed와 method로 만들어진 main메소드가 없는 클래스
라이브러리클래스
실행클래스 (메인메소드를 가지고있다)
Coffee.class
Order.class
public static void main(String[] args)

Coffee americano = new Coffee();
Order nightOrder = new Order
......
.
.

this.

  • this는 class내에서만 사용 할 수 있다.
  • this는 두가지를 의미한다. (1. 힙메모리에있는 인스턴스객체를 의미  2. 생성자를 의미)
  • this가 인스턴스객체를 의미한다면 값은 인스턴스의값따라 달라진다. 
  • this가 생성자를 의미한다면 또다른 생성자를 생성할때 다른생성자를 불러와 중복코딩을 줄일 수 있다.
Coffee.java 실행클래스


public class Coffee{
String name;
    int price;
    
    
    public Coffee(String name){
     this.name = name;
    }
    
   
    public Coffee(String name, int price){
        this.name = name;
        this.price = price;
    }
}






public class CoffeeEx{

    public static void main(String[] args){

    Coffee americano = new Coffee("아메리카노",4500);


    }

}
this 는  실행클래스에서 호출한 'americano'인스턴스를 의미한다.