Etc/2020

시험 준비용 Java 기초, SQL, Spring 정리본

메바동 2020. 5. 12. 17:55
728x90
📝

시험 준비

Java

  1. static, final 차이점
    • static : Java에서 static 키워드를 사용한다는 것은 메모리에 한 번 할당되어 프로그램이 종료될 때 해제되는 것을 의미

      → 클래스에 고정된 필드와 메소드 - 정적 필드, 정적 메소드 (모든 객체가 공유할 수 있다고 해서 클래스 변수, 클래스 메소드라고도 부름)

      일반적으로 우리가 만드는 Class는 Static 영역에 생성되고, new 연산을 통해 생성한 객체는 Heap 영역에 생성, 객체의 생성 시에 할당된 Heap 영역의 메모리는 Garbage Collector를 통해 수시로 관리를 받음

      static 키워드를 통해 Static 영역에 할당된 메모리는 모든 객체가 공유하는 메모리라는 장점을 지니지만, Garbage Collector의 관리 영역 밖에 존재하므로 static을 자주 사용하면 프로그램의 종료 시까지 메모리가 할당된 채로 존재하므로 시스템의 퍼포먼스에 악영향을 미침

      • 특징 : static 변수는 클래스 변수, 객체를 생성하지 않고도 static 자원에 접근이 가능
      public class MyCalculator {
      	public static appName = "MyCalculator";
      
      	public static int add(int x, int y) {
      		return x + y;
      	}
      
      	public int min(int x, int y) {
      		return x - y;
      	}
      }
      
      MyCalculator.add(1, 2); // static 메소드이므로 객체 생성 없이 사용 가능
      
      MyCalculator cal = new MyCalculator();
      cal.add(1, 2); // 가능하지만 권장하지 않는 방법

       

      • 인스턴스 멤버 선언과 정적 멤버 선언의 기준
        • 필드

        객체마다 가지고 있어야 할 데이터 : 인스턴스 필드

        공용적인 데이터 : 정적 필드

        • 메소드

        인스턴스 필드로 작업해야 할 메소드 : 인스턴스 메소드

        인스턴스 필드로 작업하지 않을 메소드 : 정적 메소드 → static 변수는 static 메소드를 통해 접근하도록 권장됨

         

      • static 초기화 블록 : 클래스가 메소드 영역으로 로딩될 때 자동으로 실행하는 블록

      → 정적 필드의 복잡한 초기화 작업과 정적 메소드 호출 가능

      → 클래스 내부에 여러 개가 선언되면 선언된 순서대로 실행

       

      • static 메소드와 초기화 블록 작성 시 주의할 점
        • 블록 내부에 인스턴스 필드나 인스턴스 메소드 사용 불가능
        • 객체 자신의 참조인 this 사용 불가

       

      • 싱글톤(Singleton) : 하나의 애플리케이션 내에서 단 하나만 생성되는 객체
        • 만드는 방법 :

          외부에서 new 연산자로 생성자를 호출할 수 없도록 막기 ( private 접근 제한자를 생성자 앞에 붙임)

          클래스 자신의 타입으로 정적 필드 선언 (자신의 객체를 생성해 초기화, private 접근 제한자를 붙여 외부에서 필드 값 변경이 불가능하도록 함)

          외부에서 호출할 수 있는 정적 메소드인 getInstance() 선언 (정적 필드에서 참조하고 있는 자신의 객체 리턴)

      public class Singleton {
          private static Singleton instance = new Singleton();
          
          private Singleton() {}
          
          public static Singleton getInstance() { return instance; }
      }
      
      public class SingletonTests {
          public static void main(String[] args) {
              Singleton st1 = Singleton.getInstance();
              Singleton st2 = Singleton.getInstance();
              
              if(st1 == st2) {
                  System.out.println("같은 객체"); // 결과는 "같은 객체"
              } else {
                  System.out.println("다른 객체");
              }
          }
      }

       

      + static import : 다른 클래스에 존재하는 static 멤버들을 불러와서 사용하기 위해 선언 / 클래스명과 점을 통한 호출 없이 바로 사용 가능

      ex) import static packageName.ClassName.staticMemberName 혹은 import static packageName.ClassName.*

       

    • final : 프로그램을 작성하는 과정에서, 특정한 어떤 값이 변경되지 않아야 할 때, final(상수) 키워드 사용 / 변수와 메소드, 그리고 클래스에서 사용 가능
      • final 변수 : final [타입] [변수명] = 초기화; → 일반적으로 static을 붙여서 사용

        상수 선언, 모두 대문자를 사용하여 해당 변수가 final 임을 인식시켜주는 것이 좋음

         

      • final 객체

        final 변수는 값을 변경할 수 없지만 final 객체인 경우 값을 변경할 수 있음, 하지만 주소 값은 변경 불가능

        → final 객체는 값을 가지고 있는 것이 아닌 주소를 참조하고 있기 때문

         

      • final 메소드 : final [반환타입] [메소드명]

        메소드에 final이 붙어 있을 경우 Override(오버라이딩, 재정의)가 불가능

         

      • final 클래스 : final [접근제한자] [클래스명]

        클래스에 final이 붙을 경우 클래스 상속이 불가능

     

  1. Call by value, Call by reference 차이점
    • Call by value : 값에 의한 호출

      → 메소드 호출 시에 사용되는 인자의 메모리에 저장되어 있는 값(value)을 복사하여 보냄

      Java는 Call by value로 동작

       

    • Call by reference : 참조에 의한 호출

      → 메소드 호출 시 사용되는 인자의 값의 메모리에 저장되어 있는 주소(Address)를 복사하여 보냄, 값이 아닌 인자 그 자체의 주소 값

     

    • Java에서 기본형 타입 변수와 참조형 타입 변수 모두 Call by value 방식으로 메소드에서 받아짐

      기본형 타입은 그 값을 복사해서 주지만 참조형 타입은 값의 주소가 저장되는 것이므로 그 값의 래퍼런스가 복사되어 Call by reference를 흉내 낼 수 있음

     

  1. 인터페이스, 추상클래스 차이점
    • interface : 추상클래스처럼 추상 메소드를 갖지만 추상 클래스보다 추상화 정도가 높아서 추상 클래스와 달리 몸통을 갖춘 일반 메소드 또는 멤버 변수를 구성원으로 가질 수 없음 → Java 8부터 default 메소드와 static 메소드를 이용해 몸통을 갖춘 메소드를 가질 수 있음

      → 클래스에서 implements로 구현 가능

      • 인터페이스 구성 멤버 : 상수, 추상 메소드, 디폴트 메소드, 정적 메소드

      인터페이스에 선언된 필드는 모두 public static final로 자동적으로 컴파일 과정에서 붙게 됨

      인터페이스의 메소드는 기본적으로 실행 블록이 없는 추상 메소드로 선언하고 public abstract를 생략하더라도 자동적으로 컴파일 과정에서 붙게 됨

      인터페이스는 인터페이스로부터만 상속(Extends) 받을 수 있으며, 클래스와 달리 다중 상속이 가능

       

      • 인터페이스 클래스의 장점
        1. 개발 시간을 단축시킬 수 있음
        1. 표준화가 가능
        1. 서로 관계없는 클래스들에게 관계를 맺어줄 수 있음
        1. 독립적인 프로그래밍 가능

     

    • abstract : 추상적으로 그려져 있는 클래스, 전체적인 구성을 다 가지지 못한 채 설계만 되어있는 클래스로 상속(Extends)을 통해 완성이 됨

      → 클래스에서 extends로 구현 가능

      • 추상 메소드가 하나 이상 포함되면 반드시 추상 클래스로 선언
      • 추상 클래스에서 추상 메소드가 아닌 일반 메소드를 포함시킬 수 있음
      • 추상 클래스를 상속하는 자식 클래스에서는 부모가 가진 추상 메소드를 모두 오버라이딩 해야 함
      • 추상 메소드는 몸체가 없고 선언부만 존재

       

    • interface와 abstract의 차이점
      • abstract 클래스는 완성된 메소드를 사용할 수 있지만, interface는 추상 메소드, static 메소드, default 메소드 선언만 가능
      • abstract 클래스는 다중 상속이 불가능, interface는 다중 구현(상속)이 가능
      • 사용 목적

        interface → 구현 객체가 같은 동작을 하는 것을 보장하는 것이 목적

        abstract 클래스 → 기능을 확장하는 것이 목적, 공통적인 기능을 묶어 상위 클래스화하고, 구현이 필요한 것들을 추상화

      • 상태를 가질 수 있는지 여부 : abstract 클래스는 기본적으로 클래스라 변수를 가질 수 있음, interface는 상수만 가질 수 있음
      • 생성자를 가질 수 있는지 여부 : abstract 클래스는 생성자를 가질 수 있고, interface는 생성자를 가질 수 없음

     

  1. 상속 개념
    • 상속(Inheritance)이란?

      자식(하위, 파생) 클래스가 부모(상위) 클래스의 멤버를 물려받는 것

      상속 대상 : 부모의 필드와 메소드

       

    • 상속 개념의 활용

      효과

      • 부모 클래스를 재사용해 자식 클래스를 빨리 개발 가능
      • 반복된 코드 중복을 줄임
      • 유지 보수 편리성 제공
      • 객체 다형성 구현 가능

      상속 대상 제한

      • 부모 클래스의 private 접근제어자를 갖는 필드와 메소드는 제외
      • 부모 클래스가 다른 패키지에 있을 경우, default 접근제어자를 갖는 필드와 메소드도 제외

       

    • 기타

      부모 생성자를 호출할 때는 super()를 사용

      @Overried를 이용한 메소드 재정의 시 접근 제한을 더 강하게 할 수 없음, 새로운 예외 throws 불가

      접근제한자 protected는 같은 패키지에서는 default와 동일하고 다른 패키지에서는 자식 클래스만 접근을 허용

     

  1. Collection
    • Collection Framework : 객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 제공되는 컬렉션 라이브러리

     

    • 주요 인터페이스
      • List : 순서를 유지하고 저장, 중복 허용 / ArrayList, Vector, LinkedList
        • 주요 메소드

          boolean add(E e) : 주어진 객체를 맨 끝에 추가

          void add(int index, E element) : 주어진 인덱스에 객체를 추가

          set(int index, E element) : 주어진 인덱스에 저장된 객체를 주어진 객체로 바꿈

           

          boolean contains(Object o) : 주어진 객체가 저장되어 있는지 여부

          E get(int index) : 주어진 인덱스에 저장된 객체를 리턴

          boolean isEmpty() : 컬렉션이 비어 있는지 조사

          int size() : 저장되어있는 전체 객체수를 반환

           

          void clear() : 저장된 모든 객체를 삭제

          E remove(int index) : 주어진 인덱스에 저장된 객체를 삭제

          boolean remove(Object o) : 주어진 객체를 삭제

         

      • Set : 순서를 유지하지 않고 저장, 중복을 허용 안 함 / HashSet, TreeSet
        • 주요 메소드

          boolean add(E e) : 주어진 객체를 저장, 객체가 성공적으로 저장되면 true를 리턴하고 중복 객체면 false를 리턴

           

          boolean contains(Object o) : 주어진 객체가 저장되어 있는지 여부

          boolean isEmpty() : 컬렉션이 비어 있는지 조사

          Iterator<E> iterator() : 저장된 객체를 한 번씩 가져오는 반복자 반환

          int size() : 저장되어있는 전체 객체수를 반환

           

          void clear() : 저장된 모든 객체를 삭제

          boolean remove(Object o) : 주어진 객체를 삭제

         

      • Map : 키와 값의 쌍으로 저장, 키는 중복 허용 안 함 / HashMap, HashTable, TreeMap, Properties
        • 주요 메소드

          V put(K key, V value) : 주어진 키와 값을 추가, 저장이 되면 값을 반환

           

          boolean containsKey(Object key) : 주어진 키가 있는지 여부

          boolean containsValue(Object value) : 주어진 값이 있는지 여부

          Set<Map.Entry<K, V>> entrySet() : 키와 값의 쌍으로 구성된 모든 Map.Entry객체를 Set에 담아서 반환

          V get(Object key) : 주어진 키의 값을 반환

          boolean isEmpty() : 컬렉션이 비어 있는지 조사

          Set<K> keySet() : 모든 키를 Set 객체에 담아서 반환

          int size() : 저장되어있는 키의 총 수를 반환

          Collection<V> values() : 저장된 모든 값을 collection에 담아서 반환

           

          void clear() : 모든 Map.Entry(키와 값)를 삭제

          V remove(Object key) : 주어진 키와 일치하는 Map.Entry 삭제, 삭제가 되면 값을 반환

           

Database

  1. select를 이용한 쿼리문

    SELETE 문의 기본 형식

    SELECT 컬럼명
    FROM 테이블명
    WHERE 조건
    ORDER BY 기준이 되는 컬럼명; // ASC : 오름차순, DESC : 내림차순

     

    자세한 건 아래 참조

Spring Framework

  1. Spring Framework의 특징
    • 경량 컨테이너 : 스프링 컨테이너는 자바 객체의 생성, 소멸과 같은 라이프 사이클을 관리하며, 스프링 컨테이너로부터 필요한 객체를 가져와 사용
    • DI(Dependency Injection)를 지원 : 의존성 주입 / 설정 파일이나 어노테이션을 통해서 객체 간의 의존 관계를 설정
    • AOP(Aspect Oriented Programming) 지원 : 트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통으로 필요로 하지만 실제 모듈의 핵심은 아닌 기능들을 분리해서 각 모듈에서 사용
    • POJO(Plain Old Java Object) 지원 : 구식 자바 객체 지원 / 특정한 API를 상속하거나 구현하지 않은 일반적인 자바 객체로 개발 -> 프레임워크 또는 클라이언트 간의 이식성을 높일 수 있음, 테스트의 효율이 높아짐
    • 트랜잭션 처리를 위한 일관된 방법 제공 : JDBC, JTA 등 어떤 트랜잭션을 사용하던 설정을 통해 정보를 관리하므로 트랜잭션 구현에 상관없이 동일한 코드 사용 가능
    • 데이터베이스 처리를 위한 라이브러리 연동 가능
    • 엔터프라이즈 애플리케이션을 개발하는데 필요한 다양한 API 연동 가능영속성과 관련된 다양한 API를 지원
    • IoC(Inversion of Control) : 제어의 역전 / 프로그램의 제어권이 애플리케이션에서 외부로 역전된 것

     

  1. MVC 구조
  1. 클라이언트(Client)가 서버에 어떤 요청(Request)을 한다면 스프링에서 제공하는 DispatcherServlet 이라는 클래스(일종의 Front Controller)가 요청을 가로챈다.
  1. 요청을 가로챈 DispatcherServlet은 HandlerMapping(URL 분석 등...)에게 어떤 컨트롤러에게 요청을 위임하면 좋을지 검색
  1. 요청에 매핑된 컨트롤러가 있다면 @RequestMapping을 통하여 요청을 처리할 메소드에 도달
  1. 컨트롤러에서는 해당 요청을 처리할 Service를 주입(DI) 받아 비즈니스 로직을 Service에게 위임
  1. Service에서는 요청에 대한 필요한 작업 대부분(코딩)을 담당하며 데이터베이스에 접근이 필요하면 DAO를 주입받아 DB처리는 DAO에게 위임
  1. DAO는 Mybatis(혹은 Hibernate 등) 설정을 이용하여 SQL 쿼리를 날려 DB의 정보를 받아 서비스에게 다시 돌려줌
  1. 모든 로직을 끝낸 서비스가 결과를 컨트롤러에게 넘김
  1. 결과를 받은 컨트롤러는 Model 객체에 어떤 View(jsp) 파일을 보여줄 것인지 등의 정보를 담아 DispatcherServlet에게 보냄
  1. DispatcherServelet은 ViewResolver에게 받은 뷰의 정보를 넘김
  1. ViewResolver는 해당 JSP를 찾아서 (응답할 View를 검색) DispatcherServlet에게 알림
  1. DispatcherServlet은 응답할 View에게 Render를 지시하고 View는 응답 로직을 처리
  1. 결과적으로 DispatcherServlet이 클라이언트에게 렌더링 된 View를 응답

 

 


출처

  1. [망나니개발자, [Java] static변수와 static 메소드](https://mangkyu.tistory.com/47)
  1. [베짱2, [java] final 키워드, 자바 final, 변경불가, 변경금지, 상수, 상속 불가, 오버라이딩 불가](http://blog.naver.com/PostView.nhn?blogId=kiho0530&logNo=150143859108)
  1. [졸린눈, 자바[java] Call by value Call by reference](https://sleepyeyes.tistory.com/11)
  1. [Ailyn, [JAVA] 추상(abstract) 클래스와 인터페이스(interface) 클래스](https://aileen93.tistory.com/107)
  1. [삽질하는큐, [Java] Interface vs Abstract class](https://devgyugyu.tistory.com/20)
  1. [정아마추어, Spring MVC 구조의 처리 과정을 설명해보시오. (MVC process)](https://jeong-pro.tistory.com/96)

 

728x90