리팩토링

메서드정리

  • 리팩토링의 주된 작업은 코드를 포장하는 메서드를 적절히 정리하는 것.

장황한 메서드에 많은 정보가 들어가는데 마구 얽힌 복잡한 로직들에 정보가 묻힌다.핵심적인 리펙토링 기법은 메서드 추출과 메서드 삽입이 있다.

메서드 추출에서 가장 어려운 작업은 지역변수를 처리하는 것인데 그것은 주로 임시 변수 때문이다.

임시변수를 메서드 호출로 전환을 실시해서 없어도 되는 임시변수는 전부 제거

메서드 추출 (extract Method)

  • 어떤코드를 그룹으로 묶어도 되겠다고 판단될 땐 그 코드를 빼내어 목적을 잘 나타내는 직관적 이름의 메서드로 만들자.

void printOwing(double mount){
  printBanana();

  System.out.println("name " + _name);
  System.out.println("mount " + mount);
}

리팩토링

void printOwing(double mount){
  printBanana();
  printDetail(mount);
}

private void printDetail(double mount) {
  System.out.println("name " + _name);
  System.out.println("mount " + mount);
}


  • 동기

    • 메서드 코드가 너무길거나 코드에 주석을 달아야 의도를 이해할 수 있을 때 사용함

    • 직관적 이름의 간결한 메서드가 좋은 이유   
      1.메서드가 잘게 쪼개져 있을 경우 다른메서드에서 사용하기 쉽다.
      2.상위 계층의 메서드에서 주석같은 더 많은 정보를 읽을수 있다
      3.재정의 하기 훨씬 수월하다.


  • 방법

    • 목적에 부합하는 이름의 새 메서드를 생성하자. 이때 메서드명은 원리가 아니라
      기능을 나타내는 이름으로 해야좋다.

    • 기존의 메서드에서 빼낸 코드를 새로 생성한 메서드로 복사하자.

    • 빼낸 코드에서 기존 메서드의 모든 지역변수 참조를 찾자 그것들을 새로 생성한 메서드의 지역변수나 매개변수로 사용

    • 빼낸 코드에서 읽어들인 지역변수를 대상 메서드에 매개변수로 전달한다.

    • 모든 지역변수 처리를 완료했으면 컴파일을 실시하자.

  


  • 예제 : 지역변수 사용안함

void printOwing(){
  Enumeration e = _orders.elements();
  double outstanding = 0.0;

  System.out.println("----------------------");
  System.out.println("---------고객외상-------");
  System.out.println("----------------------");
 
  while(e.hasMoreElements()){
      Order each = (Order) e.nextElement();
      outstanding += each.getAmout();
  }

  System.out.println("고객명 : " + _name);
  System.out.println("외상액 : " + outstanding);
 
}


    • 위의 코드중 배너 관련 코드를  아래와 같이 리팩토링 할 수 있다


void printOwing(){
  Enumeration e = _orders.elements();
  double outstanding = 0.0;

  printBaner();

  while(e.hasMoreElements()){
      Order each = (Order) e.nextElement();
      outstanding += each.getAmout();
  }

  System.out.println("고객명 : " + _name);
  System.out.println("외상액 : " + outstanding);

}

private void printBaner() {
  System.out.println("----------------------");
  System.out.println("---------고객외상-------");
  System.out.println("----------------------");
}

  • 예제 : 지역변수 사용

void printOwing(){
  Enumeration e = _orders.elements();
  double outstanding = 0.0;

  printBaner();

  while(e.hasMoreElements()){
      Order each = (Order) e.nextElement();
      outstanding += each.getAmout();
  }

  System.out.println("고객명 : " + _name);
  System.out.println("외상액 : " + outstanding);

}


    • 위 코드 중 세부내역 출력코드를 하나의 매개변수를 받는 메서드로 리팩토링 가능.


void printOwing(){
  Enumeration e = _orders.elements();
  double outstanding = 0.0;

  printBaner();

  while(e.hasMoreElements()){
      Order each = (Order) e.nextElement();
      outstanding += each.getAmout();
  }

  printDetails(outstanding);

}

private void printDetails(double outstanding) {
  System.out.println("고객명 : " + _name);
  System.out.println("외상액 : " + outstanding);
}


  • 예제: 지역변수를 다시 대입하기

void printOwing(){
  Enumeration e = _orders.elements();
  double outstanding = 0.0;
  printBaner();
  while(e.hasMoreElements()){
      Order each = (Order) e.nextElement();
      outstanding += each.getAmout();
  }
  printDetails(outstanding);
}

    • 계산부분을 아래와 같이 리팩토링 할 수 있음.

void printOwing(){
  printBaner();
  double outstanding = getOutstanding();
  printDetails(outstanding);
}
private double getOutstanding() {
  Enumeration e = _orders.elements();
  double outstanding = 0.0;
  while(e.hasMoreElements()){
      Order each = (Order) e.nextElement();
      outstanding += each.getAmout();
  } return outstanding;
}

    • 열거형 e 변수는 빼낸 코드에서만 사용되므로 새메서드로 아예 옮겨도 된다.
      메서드를 컴파일하고 테스트 했으면 언제나 처럼 반환값의 이름을 변경하자..


void printOwing(){
  printBaner();
  double result = getOutstanding();
  printDetails(outstanding);
}
private double getOutstanding() {
  Enumeration e = _orders.elements();
  double outstanding = 0.0;
  while(e.hasMoreElements()){
      Order each = (Order) e.nextElement();
      result += each.getAmout();
  } return result;
}

    • 변수를 두개 이상 반환해야 할때는 변수를 반환하는 각각의 메서드를 2개 만드는게
      최선의 방법이다.


메서드 내용 직접 삽입 (inline Method)

  • 메서드 기능이 너무 단순해서 메서드명만 봐도 너무 뻔할 땐 그 메서드의 기능을 호출하는 메서드에 넣고 그 메서드는 삭제하자

int getRating(){
  return (moreThanFiveLateDeliveries()) ?2:1;
}

private boolean moreThanFiveLateDeliveries() {
return _numberOfLateDeliveries > 5;
}

위의 코드를 아래와 같이 리팩토링 가능하다

int getRating(){
  return (_numberOfLateDeliveries > 5) ?2:1;
}


  • 동기

    • 메서드 기능이 지나치게 단순할 때는 메서드를 없애야 한다. 불필요한 인다이렉션은 장애물일 뿐이다.


  • 방법

    • 메서드가 재정의되어 있지 않은지 확인하자.

    • 메서드를 호출하는 부분을 모두 찾자.

    • 호출부분을 메서드 내용으로 교체하자.

    • 테스트를 하자.

    • 메서드 정의를 삭제하자.


임시변수 내용 직접 삽입 (inline Temp)

  • 간단한 수식을 대입받는 임시변수로 인해 다른 리팩토링 기법 적용이 힘들땐 그 임시변수를 참조하는 부분을 전부 수식으로 치환하자.

double bestPrice = anOrder.bestPrice();
return (bestPrice > 1000);

위의 코드를 아래와 같이 리팩토링 가능하다

return (anOrder.bestPrice() > 1000);


  • 동기

    • 임시변수가 메서드 추출등 다른 리팩토링에 방해가 된다면 임시변수 내용 직접삽입을
      적용해야함


  • 방법

    • 대입문의 우변에 문제가 없는지 확인

    • 문제가 없다면 임시변수를 final로 선언하고 컴파일하자.

    • 수정을 마칠때마다 컴파일과 테스트 하자.


임시변수 메서드 호출로 전환 (repalce Temp with Query)

  • 수식의 결과를 저장하는 임시변수가 있을 땐 그 수식을 빼내어 메서드로 만든 후 임시변수 참조부분을 전부 수식으로 교체  (다른메소드에서 호출가능)

double basePrice = _quantitiy * _itemPrice;
if (basePrice > 1000)
  return basePrice * 0.95;
else
  return basePrice * 0.98;

위의 코드를 아래와 같이 리팩토링 가능하다

public double test() {
 if (basePrice() > 1000)
      return basePrice() * 0.95;
   else
      return basePrice() * 0.98;
}
private double basePrice() {
  return _quantitiy * _itemPrice;
}


  • 동기

    • 임시변수는 일시적이고 적용이 국소적 범위로 제한된다는 단점이 있음 임시변수는 자신이 속한 메서드 안에서만 인식되므로 외부에서 접근하려면 코드가 길어짐 그래서 메서드호출로 전환하면 코드가 훨씬 깔끔해짐


  • 방법

    • 값이 한번만 대입되는 임시변수를 찾자.

    • 그 임시 변수를 final로 선언하자

    • 컴파일을 실시하자.

    • 대입문 우변을 빼내어 메서드로 만들자.

    • 컴파일과 테스트를 실시하자.

  • 예제

public double getPrice() {
   int basePrice =_quantitiy * _itemPrice;
   double discountFactor;
   if(basePrice > 1000) discountFactor = 0.95;
   else discountFactor = 0.98;
   return basePrice * discountFactor;
}

    • 아래와 같이 리팩토링 가능하다 임시변수를 메서드로 추출함으로써 직관적이고 깔끔한 코드가 완성됐다.


public double getPrice() {
  return basePrice() * discountFactor();
}

private int basePrice() {
  return _quantitiy * _itemPrice;
}

private double discountFactor() {
  if(basePrice() > 1000) return 0.95;
  return 0.98;
}



직관적 임시변수 사용 (introduce Explaining Variable)

  • 사용된 수식이 복잡할 땐 수식의 결과나 수시의 일부분을 용도에 부합하는 직관적 이름의 임시변수에 대입하자.

if((platform.toUpperCase().indexOf("MAC") > -1)&&
      (browser.toUpperCase().indexOf("IE") > -1)){
  //기능코드
}

위의 코드를 아래와 같이 리팩토링 가능하다

final boolean isMacOs = platform.toUpperCase().indexOf("MAC") > -1;
final boolean isIeBrowser = browser.toUpperCase().indexOf("IE") > -1;


if(isMacOs && isIeBrowser){
  //기능코드
}


  • 동기

    • 수식이 너무 복잡해져서 이애하기 힘들 경우 임시변수를 사용하면 수식을 더 처리하기 쉽게 쪼갤수 있다.

  • 방법

    • 수식에서 한부분의 결과를 임시변수의 값으로 교체하자

    • 그 임시 변수를 final로 선언하자

    • 컴파일과 테스트를 실시하자.








JVM 작동원리

JVM 은 자바응용프로그램을 실행하기 위한 런타임 엔진의 역할을 함 
JVM은 자바코드에 있는 MAIN 메소드를 실제 호출하는 것 
JVM은 JRE의 일부

JAVA 응용 프로그램은 WORA( WRITE ONCE RUN ANYWHERE) 라고 함 이는 프로그래머가 하나의 시스템에서 JAVA 코드를 개발할수 있고 조정없이 다른 JAVA 지원 시스템에서 JAVA 코드가 실행될 수 있음을 의미 이것은 JVM 때문에 모두 가능




 클래스 로더의 역할 
  로드, 연결, 초기화 
로드 : 클래스 로더는 .CLASS 파일을 읽고 해당 데이터를 생성한 다음 메소드 영역에 저장 
        각 .CLASS 파일에 대해 JVM은 메소드 영역에 다음 정보를 저장함 
      1. 로드된 크래스 및 적접적인 부모 클래스의 정규화된 이름
      2. .CLASS 파일이 CLASS 또는 INTERFACE 또는 ENUM과 관련이 있는지 여부 
      3. 변수와 메소드의 정보 등 

.CLASS 파일을 로드한 후 JVM은 클래스 유형의 오브젝트를 작성하여 힙 메모리에 표기합니다. 이 객체는 java.lang패키지에 미리 정의된 class유형이며 이객체 참조를 얻으려면 object 클래스의 getClass() 메서드를 사용가능



연결 : 확인, 준비, 해결

확인 : .class 파일의 정확성을 보장한다. 즉, 유효한 컴파일러에 의해 파일 포맷 및 생성 여부를 확인한다 확인에 실패하면 런타임 예외 java.lang.VerifyError가 발생
준비 : JVM은 클래스 변수에 메모리를 할당하고 메모리를 기본값으로 초기화한다.
해결방법 : 이는 기호 참조를 유형에서 직접 참조로 대체하는 과정이다. 이 작업은 참조된 도면요소를 찾기 위해 방법 영역을 탐색하여 수행된다.

초기화 : 이단계에서 모든 정적변수는 코드 및 정적블록에 정의된 값으로 지정됩니다. 


일반적으로 세가지 클래스 로더가 존재
  1. 부트 스트랩 클래스 로더 : 모든 jvm구현에는 부트스트랩 클래스 로더가 있어야 함 java_home/ jre /lib  디렉토리에 있는 핵심 java api 클래스를 로드 하며 이경로는 일반적인 부트스트랩 경로라함 
  2.  확장 클래스 로더 : 부트 스트랩 클래스로더의 자식정도로 해석가능  java_home/jre/lib/ext(확장경로)또는 java.ext.dirs 시스템 특성으로 지정된 다른디렉토리에 있는 클래스를 로드. sun.mics.Launchers $ExtClassLoader클래스에 의해 java로 구현
  3. 시스템/응용 프로그램 클래스 로더 : 확장 클래스 로더의 자식정도로 해석가능 내부적으로 java.class.paht에 매핑된 환경 변수를 사용


// Java code to demonstrate Class Loader subsystem
public class Test
{
    public static void main(String[] args)
    {
        // String class is loaded by bootstrap loader, and
        // bootstrap loader is not Java object, hence null
        System.out.println(String.class.getClassLoader());
  
        // Test class is loaded by Application loader
        System.out.println(Test.class.getClassLoader());
    }
}    

산출:
null
sun.misc.Launcher$AppClassLoader@73d16e93



    실행 방법
계층구조 원칙에 따라 클래스를 로드 함. 시스템 클래스 로더는 확장 클래스 로더에 요청하여 부스트스랩 클래스 로더에 요청을 위임함  부트스트랩 경로에 클래스가 있으면 클래스가 로드되고 그렇지 않으면 다시 요청이 확장 클래스로더로 전달되고 없으면 다시 시스템 클래스 로더로 전달됨 최종적으로
클래스를 로드하지 ㅇ못하면 실행 시 classNotFoundException이 발생함




JVM 메모리






메소드 영역 : 메소드 영역에는 정적변수를 포함하여 클래스명, 직접적인 부모클래스 이름, 메소드 변수정보와 같은 모든 클래스 레벨 정보가 저장JVM당 1개의 영역이 있으며 이는 공유됨

힙 영역 : 모든 객체 정보가 저장됨 , JVM당 하나의 영역만 존재하며 공유됨

스택 영역 : 모든 스레드에 대해 JVM은 여기에 저장된 하나의 런타임 스택을 만듬 이 스택을 활성화 레코드/ 스택 프레임이라고 함 
해당 메소드의 모든 로컬 변수는 해당 프레임에 저장됨 스레드가 종료된 후에는 런타임 스택이 JVM에 의해 삭제됨 공유되지 않음

PC 레지스터 : 스레드의 현재 실행 명영의 주소를 저장함 각 스레드는 별도의 PC 레지스터를 보유함 
원시 메소드 스택 : 모든 스레드으ㅔ 대해 별도의 원시 스택이 작성됨 네이티브 메소드 정보를 저장함 


실행엔진 (EXCUTION ENGINE)
실행 엔진은 .CLASS(바이트 코드)를 실행 함  한줄씩 바이트코드를 읽고 다양한 메모리 영역에 있는 데이터와 정보를 사용하고 지침을 실행 

실행엔진의 분류
  1. 인터 프리터 : 바이트 코드를 한줄씩 해설한 다음 실행 ,
  2. JIT(JUST - IN TIME COMPILEER) 인터프리터의 효율성을 높이는데 사용 , 전체 바이트 코드를 컴파일하여 원시 코드로 변경하므로 인터프리터가 반복적인 메소드 호출을 볼때마다 JIT가 해당부분에 대한 직접 원시 코드를 제공하므로 효율적이다.
  3. 가비지 콜렉터  : 참조ㅈ되지 않은 객체를 파괴한다. ? 


































JDK , JRE ,JVM 간의 차이점
 
자바 개발 키트 (JDK)
JAVA Development Kit (JDK) 는 JAVA 응용 프로그램 및 애플릿을 개발하는데 사용되는 소프트웨어 개발환경
여기엔는 JAVA Runtime Environment(JRE) , 인터프리터/로더, 컴파일러(JAVAC) 아카이버(JAR) 문서 생성기(JAVADOC)  및 자바개발에 필요한 기타도구가 포함됨

자바 런타임 환경(JRE)
JAVA Runtime Environment의 약자이며 JAVA RTE 로 표현하기도 합니다.JAVA 응용프로그램을 실행하기 위한 최소 요구사항을 제공합니다. 그것으로 구성되어 JAVA가상머신 JVM 핵심 클래스 및 지원 파일 

JDK = JRE + DEVELOPEMENT TOOL
JRE = JVM + Library Classes


JDK = 자바 프로그램을 개발하고 실행할수 있는 환경을 제공 JDK 는 자바개발자만 사용
JRE  = 컴퓨터에 JAVA 프로그램만 실행 할수있는 환경을 제공하는 설치 패키지 
JVM =  JDK와 JRE모두에 포함되어있거나 포함되어있어 JDK와 JRE에서 매우 중요한 부분을 차지함 
모든 자바 프로그램은 JVM으로 들어가고 JVM은 JAVA프로그램을 라인단위로 실행해야 하므로 인터프리터라고도 합니다.

JRE와 JDK의 작동방법

JRE의 구성
  1. 배치기술 
  2. AWT
  3. IDL
  4. 기타기본라이브러리
  5. JVM
 JRE 작동방법


클래스 로더 
클래스 로더는 프로그램 실행에 필요한 모든 클래스를 로드합니다 로컬 파일 시스템의 네임 스페이스를 네트워크를 통해 가져온 네임스페이스와 분리하여 보안을 제공합니다.

바이트코드 검사
JVM 형식을 검사하고 불법적 코드를 검사하는 BYTE CODE VERIFIER 를 통해 코드를 삽입합니다. 

인터프리터 
런타임 시 바이트코드는 인터프리터에 의해 로드되고 검사되고 실행됩니다.
인터프리터의 역할 
  1. 바이트 코드 실행
  2. 기본 하드웨어에 대한 적절한 호출









두 작업 모두를 다음과 같이 표시





























스프링 인터셉터를 이용하여 log4j 설정


1. 적당한 곳에 패키지 생성 후 클래스 만들어 줌 interceptor로 사용


클래스명 :LoggerInterceptor 

패키지위치 :com.spring.common.logger



소스


public class LoggerInterceptor extends HandlerInterceptorAdapter {

    

protected Log log = LogFactory.getLog(LoggerInterceptor.class);


    @Override

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        if (log.isDebugEnabled()) {

        log.debug("======================================          START         ======================================");

        log.debug(" Request URI \t:  " + request.getRequestURI());

        }

        return super.preHandle(request, response, handler);

    }

     

    @Override

    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

        if (log.isDebugEnabled()) {

        log.debug("======================================           END          ======================================\n");

        }

    }

}





2. servlet-context.xml 파일 수정하여 인터셉터 추가 및 맵핑 



<!--인터셉터 설정 -->

     <mvc:interceptors>

        <mvc:interceptor>

            <mvc:mapping path="/**"/>

            <beans:bean id="loggerInterceptor" class="com.spring.common.logger.LoggerInterceptor" />  

        </mvc:interceptor>

    </mvc:interceptors>



<mvc:interceptors> 가 안먹히고 오류가 한참 뜨는데 이유를 모르겠더이다  나중에 알고 보니 

servlet-context.xml파일 최상위에 beans:bean에 mvc를 정의해주지 않아서였음 

 xmlns:mvc="http://www.springframework.org/schema/mvc"

이거 추가해야 인터셉터 설정이 정상적으로 됨 



<?xml version="1.0" encoding="UTF-8"?>

<beans:beans xmlns="http://www.springframework.org/schema/mvc"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:beans="http://www.springframework.org/schema/beans"

xmlns:context="http://www.springframework.org/schema/context"

xmlns:mvc="http://www.springframework.org/schema/mvc"

xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd

http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">




3. controller 에 

로그 남겨주면 잘 나온다...




친절한 블로그들 많으니까 자세한건 다른 블로그 가서 보길..

http://addio3305.tistory.com/43




내가 가장 헤멘 부분은 


2. servlet-context.xml 파일 수정하여 인터셉터 추가 및 맵핑 



<!--인터셉터 설정 -->

     <mvc:interceptors>

        <mvc:interceptor>

            <mvc:mapping path="/**"/>

            <beans:bean id="loggerInterceptor" class="com.spring.common.logger.LoggerInterceptor" />  

        </mvc:interceptor>

    </mvc:interceptors>



xml파일 최상단에 mvc 추가 되어있는지 확인하고 작업하길 바랍니다.



이거 제외하면 어려울게 없다 


정리 개떡같이 못한다.

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ


컨셉 잘 잡은듯 ㅋㅋㅋ












주요 특성
1. abstraction 추상화
ㄴ 객체와 프로시저들의 공통의 특질을 골라내는 과정
필드와 메소드를 구분!
ex) 삼각형 원--> 도형
기능
알고리즘을 한번만 작성하고 여러 상황에서 쓰일 수 있도록 한다.
객체
하나의 클래스에 관련 있는 속성과 메서드를 그룹짓는다.
2. information hiding
객체 데이터를 외부에서 접근하지 못하도록 하는 방법
왜? 할까?

외부에서 데이터에 접근할 경우 잘못된 데이터를 입력해도 이를 체크할수없다.
잘못된 값이 입력될 확률이 없다면 인포메이션 하이딩 할필요가 없다.

3.encapsulation
필드와 메소드를 외부에 공개하지 않는것 (캡슐화)
구현된 클래스의 세부사항을 숨긴다.
장점 : 클래스 내부를 알필요없이 쓰기만 하면된다 쉬워짐
단점 : 숨겨진 기능을 변경하고자 할 때 처리하기 어려워진다
상속받고 재정의 하기 어려워질수 있음


자바에서 oop 3가지 특성
1.캡슐화
2.상속
3.다형성




오브젝트와 클래스
오브젝트는 메모리에 생성
커피,컵등등 사물 만져지는 것은 전부 오브젝트라고 부른다.
오브젝트는 그룹핑 할 수 있습니다.

클래스는 메모리에 로딩
사물에 대한 설계도 : 클래스라고 합니다
클래스 쥑이네
설계도가 있다면 설계도를 이용해서 사물을 만들어 낼수 있음


클래스를 이용해 오브젝트를 만들고 이가 있는 곳을 메모리(힙)이라고 함.


클래스
1.클래스는 객체가 포함하고있는 data를 나타낸다.
2..클래스는 객체가 보여주는 기능을 나타낸다.

즉 클래스는 객체가 포함하고 있는 data와 보여주는 기능을 나타낸다.


오브젝트
필드와 메소드 설계도(클래스)에 의해 정해진 값과 기능

필드 : 속성 값
메소드: 행동

객체간 관계
객체는 혼자 존재하지 않습니다.

객체관계
1 is a :
삼각형은 도형이다. 사각형은 도형이다 --> ~~는 ~~ 이다.
삼각형은 종이에 그릴 수 있는 속성이 있다.
사각형은 종이에 그릴 수 있는 속성이 있다.--> darwable();
Triangle t=new Triangle();
Shape s=(Shape)t;
Drawable d=(Drawable)t;

2.has a :
삼각형은 세개의 점을 가지고 있다
사각형은 네개의 점을 가지고 있다.
Triangle 은 point를 가지고 있다.
t.point(); ~~는~~를 가지고있다.



오브젝트 멤버를 참조하는 방법 : 닷 노테이션.

상속 inheritance

상속은 새로운 클래스가 기존의 클래스의 자료와 연산을 이용할 수 있게 하는 기능
상속을 통해서 기존의 클래스를 상속받은 하위 클래스를 이용ㅇ해
프로그램의 요구에 맞추어 클래스를 수정할 수 있고 클래스 간의 종속 관계를 형성함으로써
객체를 조직화 시킬 수 있다.

다형성 polymorhism

다형성은 많은 다른 형태를 가질 수 있는 성질을 말한다.ㅏ
예를들어 manager 클래스는 employee 성질을 가질 수 있음.

하나의 객체는 오로지 하나의 행태만을 가진다.




객체 : 속성과 동작으로 구성되어있으며 자신의 속성을 가지고 다른것과 식별가능한것.
객체 지향 프로그래밍의 특징: 캡슐화,상속,다형성
캡슐화 : 객체으 ㅣ필드,메소드를 하나로 묶고 실제 구현 내용을 감추는 것을 말한다.
객체가 손상되지 않도록 하기 위해;
상속 : 필드와 메소드를 하위 객체에 물려주어 쉽고 빠르게 설계할수있고,
반복된 코드의 중복을 줄여 줌

다형성 : 같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질
EX))하나의 타입에 여러가지 객체를 대입함으로써 다양한 기능을 사용가능

객체와 클래스
클래스 : 개발자가 콬딩한 소스로 부터 나오는 설계도 (CLASS)
필드와 메소드가 정의 되어 있음
객체 : CLASS로 만들어진 객체 (인스턴스 )

객체 지향 프로그래밍의 3단계
1 . 클래스 설계
2. 사용할 객체 생성
3. 생성된 객체 이용

클래스 선언
1. 하나이상의 문자로 이루어져야 함.
2. 첫글자는 숫자 불가
3. 특수문자는 $와 _만 사용 가능
4. 자바 키워드 사용 불가 EX) int , string ..

객체 생성 방법 : new연산자를 사용하면됨
Scanner key = new Scanner();
클래스명 변수 = 연산자 생성자

여기서 생성자는 힙 메모리 영역에 생성됨
변수가 값을 담는것이 아닌 힙 영역의 주소를 저장함

클래스의용도
1. 라이브러리(API) 다른 클래스에서 이용할 목적으로 설계
2. 실행용 : 프로그램 실행 진입점인 MAIN()메소드 제공하는 역할을 한다

클래스의 구성요소
1.필드,생성자.3.메소드


필드 -: 생성자와 메소드 전체에서 사용되며 객체가 소멸되지 않는 한 객체와 함께 존재한다
생성자: 객체 생성 식초기화 담당
메소드 : 객체간의 데이터 전달의 수단 사용

필드 초기화방법
1. 필드 생성시 초기값 주는 방법
2. 생성자를 통해 초기값을 주는 방법


생성자 오버로딩(OVERLOADING)
외ㅜ에서 제공되는 다양한 데이터를 이용해 객체를 초기화하려면 생성자도 다양화 될
필요성이 있음,
-매개변수를 달리하는 생성자를 여러개 선언하는것이다.
-ㅋㅋㅋㅋ시발 틀렸네

생성자 호출
클래스의 다른 생성자 호출 방법 this(매개변수);

메소드
메소드는 객체의 동작에 해당하는 중괄호 블럭을 말한다. {}

메소드 선언
public int 메소드이름 (string a,string b) { ex}
리턴타입 메소드이름 (매개변수) {실행코드 작성 실행블럭}

리턴타입 : 리턴할 값의 타입에 따라 정해짐
메소드 이름 정의하는 방법
1. 숫자로 시작하면 안됨
2.특수문자 $와 _만 사용가능
3. 메소드명은 소문자로 시작
4.단어 혼합의 경우 합쳐지는 첫 문자는 대문자 ex) getString

219쪽 다시확인 매개변수의 수를 모를 경우

리턴 타입이 있는 경우 return 이 와야함
리턴 타입이 void 인 경우 리턴값없음

메소드 오버로딩 : 클래스내에 같은 이름의 메소드를 여러개 선언하는 것을 메소드 오버로딩이라고 한다.

필요이유 : 매개값을 다양하게 받아 처리할 수 있도록 하기 위함이다.

정적멤버와 static
객체를 생성하지 않고 사용할 수 있는 피드와 메소드=정적멤버
=클래스맴버

정적맴버 선언 = static 키워드를 추가롤 붙여주면됨
static 타입, 필들

싱글톤(싱글톤)
전체 프로그램에서 단하나의 객체만 만들도록 보장해야 하는 경우
이 객체를 싱글톤이라고 함

선언 방법은 생성자 앞엥 private 을 붙여 외부에서 접근하지 못하게 하면됨

final 필드와 상수
파이널 : 초기값이 저장되면 변하지 않는다
상수 : 불변의 값으로 원주율 이나 지구의 무게 등 ..
상수는=static final 이라고 생각하면됨 공용성을 띔.


패키지 : 클래스를 체계적으로 관리하기 위해 사용하며 클래스의 일부분이기도함

import문 같은 패키지에 속하는 클래스들은 아무런 조건없이 다른 클래스를사용
할수 있지만 다라ㅡㅏㄴ패키지에 속하는 클래스를 사용하려면


접근제한자
-특정 메소드를 호춠하기 위해 접근 제한자 제공
-접근제한자의 종류
-public default protected private
-

어노테이션 = 메타데이터
어떻게 컴파일하고 처리할 것인지 알려주는 정보

어노테이션의 기능
1. 컴파일러에게 코드 문법에러를 체크하도록 정보제공
2. 소프트웨어 개발 투이 빌드나 배치 시 코드를 자동으로 생성할 수 있도록 정보를 제공
3. 실행 시 특정 기능을 실행하도록 정보를 제공


어노테이션 정의방법
public @interface AnnotationName
인터페이스를 이용해 정의함

+ Recent posts