반응형

클래스의 관계

일반화 관계(Generalization)

  • 상속관계 (is a 관계)
  • 부모클래스를 상속 받아 자식클래스에서 사용

ex) 사원클래스 / 관리자 클래스
→ 관리자는 사원이다. (O)
→ 사원은 관리자다. (X)

실체화 관계(Realization)

  • 인터페이스를 상속 받아 자식클래스에서 재정의하여 사용
  • 부모클래스의 은닉화 선언된 필드 또는 메소드는 상속되지만 접근은 불가능
  • 부모 인스턴스 생성 후 자식 인스턴스 생성

ex) 도형 인터페이스 >> 원클래스 or 삼각형클래스

연관 관계(Association) 또는 직접 연관 관계(Direct Association)

  • 포함관계 (has a 관계)
  • 클래스 안에 필드를 참조변수로 선언하여 사용 - 인스턴스 정보 저장

ex) Computer << CPU + Mainboard + Memory

집합 연관 관계(Aggregation)

  • UML2.0에서는 연관관계로 표현
  • 포함 관계의 인스턴스와 생명주기 다른 경우

ex) 컴퓨터 << 프린터

복합 연관 관계(Compostion)

  • 포함 관계의 인스턴스와 생명주기 같은 경우

ex) 게임 << 캐릭터

의존 관계(Dependency)

  • 메소드의 파라메터로 선언되어 사용되는 참조변수
  • 일시적으로 메소드에서 인스턴스를 사용할 경우

ex) TV << 리모콘


※ ObjectAid 설치(이클립스의 확장 프로그램) ↓↓
https://www.objectaid.com

상속(Inheritance)

: 클래스를 물려받아 사용하는 기능

★상속을 사용하는 이유★

  • 기존 클래스를 활용하여 보다 빠르게 새로운 클래스 작성 : 프로그램의 생산성 증가

ex) 자료실 → 게시판(상속) + 파일처리

  • 공통적인 속성과 기능을 정의한 클래스를 생성하여 상속 받아 사용 : 유지보수 효율성 증가

ex) 사람 >> 학생,강사,직원

  • 물려주는 클래스 : 부모클래스, 선조클래스, 슈퍼클래스, 기본클래스
  • 물려받는 클래스 : 자식클래스, 후손클래스, 서브클래스, 파생클래스
  • 부모클래스의 생성자는 자식클래스에게 상속 불가능
  • 부모클래스의 은닉화 선언된 필드 또는 메소드는 상속 되지만 접근 불가능
  • 상속 방법 : 단일 상속 >> 부모클래스가 하나만 존재

public class 자식클래스 extends 부모클래스 { //부모클래스의 필드 및 메소드 사용 가능 }

  • 자식클래스로 인스턴스를 생성할 경우 자식클래스의 생성자가 실행되기 전에 부모클래스 생성자가 먼저 실행

→ 부모 인스턴스 생성 후 자식 인스턴스 생성

super 키워드

: 자식클래스의 메소드에서 부모 인스턴스를 표현할 때 사용하는 키워드

  • 자식클래스의 메소드에서 부모 인스턴스의 필드 또는 메소드에 접근하기 위해 사용
  • 자식클래스의 필드 또는 메소드가 아닌 경우 자동으로 부모클래스의 필드 또는 메소드 사용 : super 생략 가능

★super 키워드를 사용하는 경우★

  1. 자식클래스의 생성자에서 부모클래스 생성자를 호출하기 위해 사용
  • 자식클래스의 생성자가 호출되기 전에 super 키워드에 의해 부모클래스의 생성자가 먼저 호출
  • super 키워드로 생성자 호출하는 명령은 생성자에서 최초의 명령으로 반드시 작성
  • super 키워드로 부모클래스의 생성자 호출이 생략된 경우 기본 생성자 호출

형식) super(값, ...);

  1. 오버라이드 선언되어 숨겨진 부모클래스의 메소드에 직접 접근해야 할 경우 사용

형식) super.메소드명(값, ...);

메소드 오버라이드(Method Override)

  • 부모클래스의 메소드를 자식클래스에서 재선언 하는 기능
  • 부모클래스의 메소드는 숨겨지고 자식클래스의 메소드만 사용
  • 상속관계에서만 구현 가능
  • 부모클래스의 메소드의 머릿부를 동일하게 선언
  • 접근지정자, 반환형, 메소드명, 파라메터, 예외전달이 반드시 동일

@override : 오버라이드 선언 메소드를 표현하기 위한 어노테이션 (Annotation)
→ 오버라이드 선언 규칙을 지키지 않을 경우 에러 발생

★상속 관계에서 참조변수(레퍼런스변수)와 인스턴스의 사용법★

⑴ 부모클래스 참조변수 = new 부모클래스(); [가능]
→ 참조변수는 부모클래스 요소에 접근 가능

⑵ 자식클래스 참조변수 = new 자식클래스(); [가능]
→ 참조변수는 자식클래스의 요소 및 부모클래스의 요소에 접근 가능
→ 부모인스턴스와 자식인스턴스를 생성하여 자식인스턴스를 참조변수에 저장

⑶ 자식클래스 참조변수 = new 부모클래스(); [불가능]
→ 자식인스턴스가 존재하지 않아 참조변수에 저장할 경우 에러 발생

★ ⑷ 부모클래스 참조변수 = new 자식클래스(); [가능]
→ 참조변수는 기본적으로 부모클래스의 요소에 접근 가능
→ 객체 형변환을 이용하면 자식클래스의 요소에 접근 가능
→ 부모인스턴스와 자식인스턴스를 생성하여 부모인스턴스를 참조변수에 저장

★객체형변환★

객체형변화 : 상속관계의 클래스에서 구현

⑴ 명시적 형변환 (강제형변환)

  • cast 연산자 이용
  • (자식클래스명 )참조변수 → 참조변수의 자료형을 상속관계의 자식클래스로 잠시 변환

((MemberEvent)member4).setEmail("aaa@google.com");
→ 자식인스턴스로 변경하여 저장 (자식클래스 접근 가능)

⑵ 묵시적 형변환(자동형변환)

  • 메소드 오버라이딩을 이용

<메소드 오버라이드에 의한 다형성>

☞ 부모참조변수에 저장된 자식인스턴스에 따라 자식인스턴스의 메소드 호출
☞ 부모참조변수에 저장된 자식인스턴스를 JVM이 자동으로 구분하여 처리

★instanceof 연산자★

  • 부모참조변수로 객체 형변환 가능한 자식인스턴스을 구분하기 위한 연산자

형식) 참조변수 instanceof 자식클래스
→ 참조변수가 자식클래스로 객체 형변환 가능한 경우 true 제공

★java.lang.Objetc 클래스★

  • 모든 클래스가 반드시 상속 받는 최선조클래스
    • 모든 인스턴스는 Object 클래스의 메소드 사용 가능
  • 클래스를 선언할 때 상속받는 클래스가 없을 경우 자동으로 Object 클래스 상속
  • 참조변수의 인스턴스 정보를 출력하면 Object 클래스의 toString() 메소드 자동 호출
    •  
    • Object 클래스의 toString() 메소드를 오버라이드 선언하여 사용

final 키워드

⑴ final 필드

형식) 접근지정자 final 자료형 필드명 = 값;

  • 필드값 변경 불가능

※ final 필드명은 모두 대문자로 작성하며 단어 구분자로 _ 사용
※ 상수필드(Constant Field) : 상수 대신 사용하기 위한 고유명칭

public static final 필드명 = 값;


ex) java.lang.Math 클래스 - public static final double PI
→ API 문서에서 Constant Field Values 에서 저장된 값 확인

⑵ final 메소드

접근지정자 final 반환형 메소드명(파라메터,...) {	
	명령;	
	...
}

→ 메소드 오버라이드 선언 불가능
ex) java.lang.Object 클래스 - public final void notify() 메소드

⑶ final 클래스

접근지정자 final class 클래스명 { }
  • 상속 불가능 → 부모클래스로 사용 불가능

ex) java.lang.System 클래스 - public final class System extends Object

반응형

추상클래스(Abstract Class)

  • 추상클래스는 인스턴스 생성 불가능 → 상속 목적의 클래스

형식) 접근지정자 abstract class 클래스명 { }

  • 추상메소드를 1개라도 가지고 있으면 반드시 추상클래스 선언

추상메소드(Abstract Method)

추상메소드 : 영역이 없는 불완전한 메소드 (명령 미존재)
형식) 접근지정자 abstract 반환명 메소드명(파라메터,...);

  • 추상메소드가 존재하는 추상클래스를 상속받은 자식클래스는 모든 추상메소드를 반드시 오버라이드 선언
    • 추상메소드를 오버라이드 선언하지 않을 경우 자식클래스도 추상클래스로 작성
★추상메소드를 만드는 이유★
자식클래스에서 반드시 선언해야 되는 메소드와 작성규칙 제공 : 작업명세서
추상클래스(부모)로 참조변수를 만들어 자식인스턴스의 정보 저장 (객체 형변환 이용)



패키지(package)

패키지(pachage) : 디렉토리(폴더)와 동일 → 파일을 구분하여 저장하기 위해 사용

  • 같은 기능의 참조형을 그룹화 하기 위해 패키지 사용


※ 참조형 : 개발자가 선언할 수 있는 자료형 → class, interface, enum

  • 참조형에 대한 소스파일 처음에 패키지 선언
    • 형식) package 패키지명;
    • → 패키지에 참조형이 선언 되었음을 표현
  • 패키지명은 도메인(Domain)을 역방향으로 나열하여 작성하는 것을 권장
    • ※ 도메인 : 인터넷에서 개인 또는 그룹이 사용할 수 있는 주소(고유값)
  • 패키지 마지막에는 작업그룹명을 작성하는 것을 권장

import

  • 참조형을 사용하기 위해서는 패키지명을 포함한 참조형으로 표현
    • 패키지에 같은 경우 패키지명을 미포함하여 표현 가능
  • 패키지명을 포함한 참조형을 import 처리하면 패키지명을 미포함하여 표현
    • 형식) import 패키지명.참조형;
    • package 명령 아래 및 참조형 선언 위에 작성
  • 이클립스에서는 참조형을 자동 완성한 경우 자동 import 처리
    • 형식) import 패키지명.*;
    • 패키지에 존재하는 모든 참조형 import 처리
  • java.lang 패키지는 자동으로 import 처리되어 있으므로 java.lang 패키지의 참조형은 사용 가능
  • 같은 이름의 참조형이 존재하므로 import 처리 주의


※ import를 정리하는 단축키 : Ctrl+Shift+O
→ 필요한 참조형을 import 처리하거나 불필요한 참조형의 import 처리 제거

지정자(Modifier) : 접근의 유무 제어

  • 접근지정자 ☞ private , public , protected , package
  • 클래스지정자 ☞ static
  • 추상지정자 ☞ abstract
  • 파이널지정자 ☞ final

접근지정자(Access Modifier)

접근지정자(Access Modifier) : 참조형의 구성요소에 접근 유무 제어

⑴ private : 참조형의 구성요소를 숨겨 접근 불가능 (은닉화)

  • 가장 제한적인 접근지정자
  • 참조형 내부에서만 접근 가능하며 외부에서는 접근 불가능
  • 필드에 잘못된 정보가 저장되는 것을 방지하기 위해 사용 → Getter & Setter(캡슐화)

※ 생성자 또는 메소드를 private 선언 가능


⑵ public

  • 무조건 접근 가능한 접근지정자
  • 참조형 내부 및 동일 패키지 또는 다른 패키지의 참조형 어디서나 접근 가능
  • 생성자 또는 메소드를 public 선언 >> 상수필드(Constant Field) 선언
참조형을 선언할 때 public 키워드를 붙이는 이유??
다른 패키지의 참조형에서 접근 가능하도록 선언
참조형에 public 키워드가 없는 경우 다른 패키지에서 접근 불가능


※ 소스파일에는 public 키워드가 선언된 참조형 하나만 선언 가능
→ 소스파일명은 반드시 public 키워드가 선언된 참조형의 이름으로 저장


⑶ package(default)

  • 접근지정자 관련 키워드를 사용하지 않고 선언한 경우
  • 참조형 내부 및 동일 패키지의 참조형에서는 접근 가능
  • 다른 패키지의 참조형에서는 접근 불가능


⑷ protected

  • 참조형 내부 및 동일 패키지의 참조형에서는 접근 가능
  • 다른 패키지의 참조형에서는 접근 불가능

but 다른 패키지의 클래스에서 상속 받은 경우에는 접근 가능


인터페이스(Interface)

인터페이스(Interface) : 상수필드(Constant Field) + 추상메소드(Abstract Method)

JDK 1.8이상에서는 기본메소드(Default Method)와 정적메소드(Static Method) 선언 가능

public interface 인터페이스명 { 
	자료형 변수명=값; //public static final 생략 
	... 
	반환형 메소드명(매개변수,...); //public abstract 생략 
	...
}

  • 인터페이스를 이용하여 인스턴스 생성 불가 → 생성자가 선언되어 있지 않기 때문
  • 인터페이스는 클래스가 상속받아 사용 → 클래스의 부모 역할 수행
  • 클래스에서 인터페이스를 상속받는 방법 → 다중상속 가능
public class 클래스명 implements 인터페이스명,인터페이스명,... {
}

※ 클래스는 단일상속만 가능하지만 인터페이스 다중상속 가능

  • 인터페이스를 상속받은 클래스는 반드시 인터페이스의 모든 추상메소드를 오버라이드 선언 (실체화 작업)
  • 인터페이스를 이용하여 참조변수를 생성하고 자식인스턴스 정보를 저장하여 객체 형변환으로 접근 가능
  • 인터페이스는 기존 인터페이스 상속 가능 (다중상속 가능)
public interface 인터페이스명 extends 인터페이스명,... {
}


★인터페이스 존재 이유★

  • Java 프로그램 작성시 단일상속의 문제점을 보완하기 위해 인터페이스 사용
    • 클래스의 단일상속 문제로 프로그램 작성의 어려움 발생

예를 들어서,
public class 늑대인간 extends 인간,늑대 [불가능]
public class 늑대인간 extends 인간 implements 늑대 [가능]
public class 흡혈늑대인간 extends 인간 implements 늑대,흡혈귀 [가능]

  • 작업명세서의 역할
    • 인터페이스를 상속받은 모든 자식클래스에 동일한 메소드 작성 규칙을 제공받아 작성
    • 클래스 간의 결합도를 낮춰 시스템 변경에 대한 프로그램 유지보수의 효율성 증가

나열형(Enum)

: 상수필드(Constant Field)

public enum 나열명 { //나열형 상수(Enum Constant) - 필드값 생략 가능 
	필드명,필드명,...; //public static final int 생략
}
  • 나열형 상수에는 내부적으로 0부터 1씩 증가되는 정수상수 자동 저장
  • 나열형 상수에 다른 자료형을 선언하거나 원하는 상수를 저장하고 할 경우 필드와 생성자 선언
    • 필드와 생성자는 반드시 private 접근지정자로 선언
    • 나열형 상수 설정시 반드시 생성자로 상수를 전달하여 저장
  • 생성자 선언할 때 매개변수에 값을 전달받아 상수필드에 초기값 저장
    • 생성자 선언한 경우 상수필드에 초기값을 전달해야만 상수필드 생성

ex) 필드명(초기값), 필드명(초기값), ... ;

  • 상수필드값을 확인하기 위한 getter 메소드 선언
  • 인터페이스의 상수필드에서 고유값으로 표현되지 않는 문제점을 해결하기 위해 사용
반응형
반응형

객체지향 프로그래밍이란?

  • 현실세계에 존재하는 사물을 모델링하여 클래스 자료형 작성 후 객체(Object)를 생성한 후 객체를 이용해 프로그램을 작성하는 방법
  • 이 객체지향(OOP)은 클래스 배포가 가능하다.
  • 즉, 프로그램 생성성 증가와 유지보수의 용이성이 증가한다.

객체지향 프로그래밍의 특성에는 추상화, 캡슐화, 다형성, 상속성이 있다.

여기서 추상화(Abstraction)란?

  • 현실세계에 존재하는 사물을 속성(값:Field)과 기능(행위:Method)으로 구분하여 클래스로 만들어 주는 방법이다. 즉, 사물을 모델링한다는 뜻
  • 클래스 → 객체 → 메소드 호출
  • 필드는 속성(Property)이라고 하기도 한다.

클래스(Class) - 참조형(Reference Type)

  • 인스턴스를 만들기 위한 자료형
  • 필드(Field)와 메소드(Method)의 모임

★ 클래스 선언 방법 ★

public class 클래스명 { 
	필드(Field); //메소드에서 필요로 하는 정보를 제공할 목적의 변수 : 변수선언 
	... 
	생성자(Constructor); //인스턴스 생성을 목적으로 하는 메소드 
	... 
	메소드(Method); //기능을 제공할 목적의 명령들의 모임 
	... 
}

★ 인스턴스 생성 방법 ★

클래스명 참조변수 = new 클래스명();

  • 객체 정보를 저장하기 위한 참조변수 선언
  • new 연산자로 생성자 호출하여 객체 생성

★ 인스턴스 사용 방법 ★

  • 참조변수에 저장된 인스턴스 정보로 필드 또는 메소드 접근 : . 연산자 이용
  • 형식) 인스턴스정보.필드 or 인스턴스정보.메소드

메소드(Method)

  • 필드에 저장된 정보를 제어하기 위한 명령들의 모임 → 기능

★ 메소드 선언 방법 ★

자료형 메소드명(자료형 변수명, 자료형 변수명,...) { 명령; ... }

  • 자료형(반환형)에는 void,int,double 등이 있다.
  • 메소드 반환형(ReturnType) - 결과형(ResultType) : 메소드를 호출하여 얻을 수 있는 결과의 자료형
  • 입출력은 안되며 출력 대신 반환을 한다.
  • void (무반환형) : 메소드를 호출하여 얻을 수 있는 결과가 없을 경우 사용하는 자료형
  • 메소드 매개변수(Parameter) = 인자(Argument)
    • 메소드의 명령을 실행하기 위해 필요한 정보를 전달받아 저장하기 위한 변수

★ 메소드 호출(Method Invoke) 방법 ★

  • 메소드를 호출해야 메소드에 작성된 명령들이 실행되어 기능 제공
  • 형식) 인스턴스.메소드명(필요정보, 필요정보,...);
  • ※ 매개변수에 정보를 제대로 전달하지 않으면 메소드 호출 불가
  • ※ 매개변수와 식별자를 하나의 메소드로 인식

★ return : 메소드를 종료하는 명령 (제어문)

⑴ if(조건식) return;

: 조건식의 결과가 참인 경우 메소드 종료

⑵ return 대상;

: 대상정보를 메소드 호출 명령으로 반환
※ 대상의 자료형과 메소드 반환형의 자료형은 반드시 동일

캡슐화(Encapsulation)

  • 추상화 작업을 통해 작성된 클래스를 보다 견고하게 작성
  • 필드의 직접적인 접근을 제한하고 메소드를 이용하여 접근하도록 프로그램 작성하는 방법
  • 인스턴스가 필드에 직접 접근하여 사용될 경우 잘못된 정보 저장 가능
  • 정보 은닉화(Information Hiding) : 인스턴스가 필드에 직접 접근하는 것을 제한

★ 접근지정자(Access Modifier) ★

  • 인스턴스가 필드에 접근할 수 없도록 private이라는 접근지정자(Access Modifier)를 이용하여 선언
  • private : 클래스 내부에서 접근 가능하여 클래스 외부에서 접근 불가능하도록 설정하는 키워드
    • 필드 선언 시 사용하여 은닉화 처리
  • public : 모든 패키지의 클래스에 서 접근 가능하도록 설정하는 키워드
    • 메소드 선언 시 사용하여 접근 처리

※ 은닉화 선언된 필드에는 필드 값 반환 또는 필드값 변경 목적의 메소드 선언

  • Getter 메소드 : 필드값 반환 목적의 메소드
public 자료형 get필드명() { 
	return 필드명; //필드값 제공
}


※ 필드 자료형이 boolean인 경우 메소드명은 "is필드명"으로 선언

  • Setter 메소드 : 필드 값 반환 목적의 메소드
public void set필드명(자료형 파라메터명) { //파라메터값에 대한 유효성 검사 
	필드명=파라메터명;//파라메터값으로 필드값을 변경
}

→ 메소드는 모든 클래스에서 접근 가능하도록 public 접근 지정자를 이용하여 선언

  • 식별자 변경 : Refactor >> Rename (Alt+Shift+R)
    • → 빌드된 클래스의 모든 식별자가 동시에 변경
  • 이클립스에서는 Getter와 Setter 메소드를 자동으로 생성하는 기능 제공
    • → Alt+Shift+S >> R >> 필드 선택 >> Generate(OK)

메소드 오버로드(Method Overload)

  • 클래스에 동일한 이름의 메소드를 선언할 수 있는 방법
  • 동일한 기능을 제공하는 메소드는 같은 이름의 메소드명으로 선언하는 것을 권장

★ 오버로드 작성 규칙 ★

  • 클래스에서 동일한 메소드명으로 선언하며 메소드 파라미터의 개수, 자료형 등을 다르게 선언
  • 메소드의 접근 지정자, 반환형은 오버로드와 무관
  • 다형성 : 동일한 이름의 메소드를 호출해도 상태에 따라서 다른 메소드가 호출되어 기능 제공

→ 파라미터(매개변수)에 전달되는 값에 따라서 다른 메소드가 호출되서 실행
→ 메소드 오버로드, 메소드 오버라이드
→ 파라미터에 전달되는 값에 따라 다른 메소드 호출

반응형

생성자(Constructor)

  • 인스턴스를 생성을 목적으로 선언하는 특별한 메소드
    • 기능 제공이 목적이 아니며, 인스턴스로 호출 불가능
  • 생성자를 선언하지 않아도 내부적으로 기본 생성자가 있는 것으로 처리
    • 생성자를 선언하지 않아도 기본 생성자로 인스턴스 생성 가능
  • ※ 기본 생성자(Default Constructor) : 파라메터와 명령이 없는 생성자 (초기화 작업 미구현)
    • 선언하지 않을 경우 클래스의 상속성에 문제가 발생하므로 반드시 선언

★생성자를 선언하는 이유★

  • 인스턴스 생성 시 초기값을 전달하여 필드에 저장하기 위해 선언
  • 인스턴스 생성 후 필요한 초기화 작업을 위해 선언 - GUI 프로그램의 디자인 작업
  • 생성자 인스턴스를 만들 때 자동 호출 → 인위적 호출 불가

★생성자 작성 방법★

  • 생성자명은 반드시 클래스명과 동일하게 선언하며 반환형을 미선언 → 값 반환 불가능
  • 메소드 오버로드 기능에 의해 여러 개의 생성자 선언 가능
public 클래스명() { 
	//Ctrl+Space >> Constructor 선택 >> Enter 
	//기본 생성자는 명령 미작성
}

public 클래스명(파라메터,...) { 
	//Alt+Shift+S >> O >> 필드 선택 >> Generate 
	//인스턴스가 생성될때 실행될 명령 작성 - 필드 초기화
}


생성자를 하나라도 선언하면 기본적으로 제공하는 기본 생성자는 소멸되므로 기본 생성자를 반드시 선언하는 것을 권장 (상속 문제 때문)

this 키워드

  • 메소드에서 클래스 자신의 인스턴스 정보를 저장하여 사용하기 위한 키워드
  • 메소드의 파라미터에 숨겨져 클래스의 인스턴스를 저장하는 참조 변수
  • 메소드를 호출한 인스턴스 정보를 자동으로 전달되어 저장

[this.필드]

  • 어떤 인스턴스의 필드 값인지 구분 가능
  • 메소드 안에서 인스턴스의 것을 표현하기 위해서 사용

this 참조 변수가 존재해야 되는 이유?
클래스를 이용하여 인스턴스를 생성할 경우 필드는 인스턴스마다 메모리에 따로 생성되지만 메소드는 클래스에 하나만 존재 → 메모리 절약

this 키워드를 생략하여 표현하지 않아도 자동으로 인식하지만 사용해야 하는 특별한 경우

⑴ 이름이 똑같은 경우에 사용(메소드의 매개변수, 필드의 이름)

public class Test { 
	private int su; 
	public void setSu(int su) { 
		this.su=su; 
	}
}

⑵ 생성자가 생성자를 호출할 경우 사용 (초기화 작업)

  • 생성자의 초기화 코드가 중복될 경우 코드 중복 최소화를 위해 사용

⑶ 메소드에서 호출한 인스턴스를 표현하기 위해서 사용 (이벤트 처리, 다중 스레드)

static 키워드

  • 인스턴스에 독립적인 필드 또는 메소드를 선언하기 위한 키워드
  • static 변수 = 클래스 변수 = 정적 포트

1. static 필드 (정적 필드)

  • 모든 인스턴스가 공유하여 사용하는 필드
  • 클래스가 메모리에 저장되면 하나만 생성되는 필드
    • 인스턴스 생성과 무관 (생성자 초기화 작업 불필요)

★static 필드 선언 방법★

접근 지정자 static 자료형 필드명 = 초기값;
→ 초기값이 생략될 경우 필드 기본값 저장

★static 필드 접근 방법★

클래스를 이용하여 필드 접근
형식) 클래스명.필드
→ 필드가 private 접근 지정자로 선언된 경우 접근 불가능

★static 필드 사용 이유★

메모리 절약과 데이타 변경 및 사용의 용이성

2. static 메소드 (정적 메소드)

  • this 참조변수가 존재하지 않는 메소드
    • 인스턴스 필드 또는 인스턴스 메소드 접근 불가능 (인스턴스 메소드 호출 불가능)
    • static 필드 또는 static 메소드 접근 가능 (클래스를 이용하여 접근하여 사용)

★static 메소드 선언 방법★

접근지정자 static 반환형 메소드명(매개변수,... ) { 
	static 필드값 제어 명령;
}


★static 메소드 호출 방법★

클래스를 이용하여 메소드 호출
형식) 클래스명.메소드명(값,...);

static 메소드를 사용 이유는?? 메서드 호출이 간편하기 때문에

그림 설명

반응형
반응형

Web Application 개발을 위한 프로그램 설치 및 환경설정

⑴ JDK 설치 및 환경설정

jdk 다운로드 및 환경변수 설정하기

⑵ DBMS 설치 (OralceXE)

[Oracle] 오라클 다운로드 후 작업

⑶ Eclipse 설치

이클립스(eclipse) 다운로드 및 실행

⑷ WAS(Web Application Server) 설치 : Apache Tomcat

https://tomcat.apache.org 사이트에서 Apache Tomcat 다운로드 압축 해제
→ 이클립스에서 사용될 수 있도록 WAS 추가 작업



JRE 경로 필요



→ 설치 완료 후 http://localhost:8080/ 브라우저 접속했을 때 하단의 캡처처럼 나오면 끝!




이클립스에서 WAS 추가 및 사용 방법 (JavaEE Perspective)

⑴ Servers View : WAS 목록 출력 및 제어(시작 또는 중지에 대한 상태 변경)

WAS 추가 : Apache Tomcat 등록


Finish → Apply and Close


그다음엔 이클립스에 서버 선택


→ Open 클릭하면 하단의 Servers 창이 생성됨



→ 저 링크 클릭


&rarr; 하단이 이렇게 바뀜



⑵ 등록된 WAS의 환경설정 : Apache Tomcat 프로그램의 환경 파일 변경(Server.xml)

  • Server 위치 변경 : Apache Tomcat 프로그램 설치 위치(Deploy Path 변경)
  • PORT 변경 : HTTP/1.1(8080 > 8000)

Tomcat v9.0 Server at localhost 더블클릭
경로 설정 후 포트 번호가 겹치지 않게 바꿔준다.

반응형

⑶ 클라이언트의 요청과 응답처리를 위해 WAS를 실행상태로 변경

  • WAS 관리 : WAS 등록, WAS 제거, 등록 위치 변경
    • Window > Preferences > Server > Runtime Environments

우클릭 후 START 클릭 - 서버 실행






Web Application 개발

⑴ Dynamic Web Project 생성

  • 프로젝트명은 웹에서 콘텍스트명(ContextName)과 동일
  • 프로젝트의 프로그램을 실행하기 위한 WAS 선택
  • web.xml 생성 : 프로젝트의 WAS 실행환경 설정

무조건 체크 해준다.
프로젝트 폴더안에 WebContent 폴더가 들어있으면 성공



⑵ Project 파일

  • Java Resource : Java 소스파일(Servlet 또는 JavaBean - DTO, DAO)
  • WebContent : CSL(HTML, CSS, JavaScript) 파일 또는 JSP 파일

조합형 한글 UTF-8 설정


⑶ 웹어플리이션 실행(Ctrl + F11) : URL 주소를 이용한 서버 자원을 WAS에게 요청

URL 주소 → http://ServerName : Port/Context/WebFilePath
ex) http://localhost:8000/web/hello.html

  • 요청과 응답은 브라우저를 이용하며 브라우저는 크롬을 사용하는 것을 권장
    • Window > Web Browser : Chrome 변경
  • 크롬이 없는 경우 >> 크롬 설치 후 등록
    • Window > Preferences > General > Web Browser : Chrome 추가



내가 만든 html파일을 실행하면 끝!! 참 간단하죠?

반응형
반응형

1번째 포스팅 참고 ☞ 신입 개발자 기술면접 준비하기 (1) - Java

 

API(Application Programming Interface) 란?

응용프로그램에서 사용할수 있도록 운영체제나 프로그래밍언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스

  • API : 애플리케이션 소프트웨어를 구축하고 통합하기 위한 정의 및 프로토콜 세트로 애플리케이션 프로그래밍 인터페이스를 나타낸다.
  • 데이터와 기능의 집합을 제공하여 컴퓨터 프로그램간 상호작용을 촉진하며, 서로 정보를 교환가능 하도록 하는 것

 

API의 장점

  • API를 사용하면 구현 방식을 알지 못해도 제품 또는 서비스가 서로 커뮤니케이션할 수 있으며 애플리케이션 개발을 간소화하여 시간과 비용을 절약할 수 있습니다.
  • 새로운 툴과 제품을 설계하거나 기존 툴과 제품을 관리하는 경우 API는 유연성을 제공하고 설계, 관리, 사용 방법을 간소화하며 혁신의 기회를 제공합니다.
  • API는 리소스에 대한 액세스 권한을 제공하고 보안과 제어를 유지할 수 있게 해주며 액세스 권한을 어떻게, 누구에게 제공할지 여부만 결정하면 됨

 

REST란?

  • REST는 Representational State Transfer 의 약자로서 웹의 장점을 최대한 활용할 수 있는 아키텍처
  • 최근의 서버 프로그램은 다양한 브라우저와 안드로이드폰, 아이폰과 같은 모바일 디바이스에서도 통신을 할 수 있어야 한다.
  • REST 아키텍처는 Hypermedia API의 기본을 충실히 지키면서 범용성을 보장한다.
  • HTTP URI(Uniform Resource Identifier)를 통해 자원(Resource)을 명시하고, HTTP Method(POST, GET, PUT, DELETE)를 통해 해당 자원에 대한 CRUD Operation을 적용하는 것을 의미한다.

 

RESTful 이란?

  • RESTful은 일반적으로 REST라는 아키텍처를 구현하는 웹 서비스를 나타내기 위해 사용되는 용어이다.

 

Http 응답상태코드

  • 성공(Success)
    • 200 상태코드 : 정상적으로 수행
    • 201 상태코드 : 자원(Resource) 생성 요청. 성공적으로 수행됨
  • 클라이언트 에러(Client Error)
    • 400 상태코드 : 클라이언트 요청이 부적절할 경우 응답 코드
    • 401 상태코드 : 클라이언트가 권한이 없는 자원을 요청하였을 때 응답 코드
    • 403 상태코드 : 보호되는 자원을 요청하였을 때 응답 코드
    • 405 상태코드 : 클라이언트가 요청한 리소스에서는 사용 불가능한 Method를 이용했을 때 응답 코드
  • 기타
    • 301 상태코드 : 클라이언트가 요청한 리소스에 대한 URI가 변경되었을 때 응답코드
    • 500 상태코드 : 서버에 뭔가 문제가 있을 때 사용하는 응답 코드
  • 500 : 서버쪽 오류로 인한 상태코드

 

MVC(Model - View - Controller) 패턴이란?

  • 애플리케이션을 세가지의 역할로 구분한 개발 방법론
  • 사용자가 Controller를 조작하면 Controller는 Model을 통해서 데이터를 가져오고 그 정보를 바탕으로 시각적인 표현을 담당하는 View를 제어해서 사용자에게 전달하게 된다.
  1. 사용자가 웹 사이트에 접속한다. (User)
  2. Controller는 사용자가 요청한 웹 페이지를 서비스하기 위해서 모델을 호출한다.
  3. 모델은 데이터베이스나 파일과 같은 데이터 소스를 제어한 후에 그 결과를 리턴한다.
  4. Controller는 Model이 리턴한 결과를 View에 반영한다.
  5. 데이터가 반영된 View는 사용자에게 보여진다.

 

MVC Model-1

  • JSP로 구현한 기존 웹 어플리케이션은 모델 1 구조로 웹 브라우저의 요청을 JSP 페이지가 받아서 처리하는 구조이다.
  • JSP 페이지 안에서 모든 정보를 표현(View)하고 저장(Model)하고 처리(Control)되므로 재사용이 힘들고, 읽기도 힘들어 가독성이 떨어진다.
  • 정의 : 모든 클라이언트 요청과 응답을 JSP가 담당하는 구조
  • 장점 : 단순한 페이지 작성으로 쉽게 구현이 가능하다. 중소형 프로젝트에 적합
  • 단점 : 웹 어플리케이션이 복잡해지면 유지보수 문제가 발생된다.

MVC Model-2

  • MVC1 구조와 달리 웹 브라우저의 요청을 하나의 서블릿이 받게 됨
  • 서블릿은 웹 브라우저의 요청을 알맞게 처리한 후 그 결과를 JSP 페이지로 포워딩
  • 정의 : 클라이언트의 요청처리와 응답처리, 비지니스 로직 처리하는 부분을 모듈화시킨 구조
  • 장점 : 처리작업의 분리로 인해 유지보수와 확장이 용이하다.
  • 단점 : 구조 설계를 위한 시간이 많이 소요되므로 개발 기간이 증가한다.

 

Spring MVC 프레임워크

  • 스프링이 제공하는 트랜젝션 처리, DI, AOP를 손쉽게 사용
  • 스트럿츠2와 같은 프레임워크와 연동이 쉬움
반응형

Spring MVC 주요 구성요소 및 처리 흐름

  • 다른 mvc 프레임워크와 마찬가지로 컨트롤러를 사용하여 요청을 처리
  • 스프링에서는 DispatcherServlet이 MVC에서의 컨트롤러(Controlle)부분을 처리

DispatcherServlet의 역할

  • 클라이언트의 요청을 전달받아 요청에 맞는 컨트롤러가 리턴한 결과값을 View에 전달하여 알맞은 응답을 생성

HandlerMapping의 역할

  • 클라이언트의 요청 URL을 어떤 컨트롤러가 처리할지 결정

Controller의 역할

  • 클라이언트의 요청을 처리한 뒤 결과를 DispatcherServlet에게 리턴

ModelAndView의 역할

  • 컨트롤러가 처리한 결과 정보를 뷰 선택에 필요한 정보를 담음

ViewResolver의 역할

  • 컨트롤러의 처리 결과를 생성할 뷰를 결정

View의 역할

  • 컨트롤러의 처리 결과 화면을 생성, JSP 또는 Velocity 템플릿 파일 등을 뷰로 사용

 

Spring MVC 개발

  • 클라이언트에 요청을 받을 DispatcherServlet을 web.xml 파일에 설정
  • 클라이언트의 요청을 처리할 컨트롤러 작성
  • ViewResolver 설정(컨트롤러가 전달한 값을 이용해서 응답 화면을 생성할 뷰를 결정)
  • JSP나 Velocity 등을 이용하여 뷰영역의 코드를 작성

 

RIA(Rich Internet Application)

  • 일반 데스크톱 애플리케이션과 같이 풍부한 유저 인터페이스를 제공하고, 다이나믹하며 모든 처리 과정을 새로고침 없이 할 수 있도록 지원해주는 웹 애플리케이션

 

AJAX(Asynchronous JavaScript and XML) 특징

  • 플러그인을 사용하지 않고 브라우저만으로 이용 가능
  • 페이지 이동없이 어떤 문서를 요청하고 응답된 결과를 가져다가 동적 처리 할 수 있도록 하는 JavaScript 라이브러리
  • 웹 서버에서 수신한 HTML 및 XML 데이터를 처리하는 데는 DOM을 사용

장점

  • 접근이 용이하며, 페이지 이동없이 고속으로 화면전환 가능
  • 비동기 통신 가능
  • 수신 데이터량을 축소할수 있으며, 웹 클라이언트에게 처리를 위임 가능
  • 화려한 유저 인터페이스 제공 등
  • 다양한 오픈 소스 프레임워크(Prototype, Dojo, jQuery, Google Web Toolkit 등) 제공

단점

  • 브라우저 호환성에 자유롭지 못하다
  • JavaScript는 유지보수 및 디버깅이 어렵다
  • Ajax가 포함된 HTML 문서를 제공한 웹 서버가 아닌 다른 웹 서버로 요청을 보낼 수 없고, 클라이언트 PC의 파일에 접근할 수 없다.

 

Ajax 기반 기술들

  • XMLHttpRequest : 웹 브라우저와 웹 서버간 비동기 통신을 위한 JavaScript 객체
  • DOM(Document Object Model) : 마크업 문서의 특정 노드를 객체 단위로 조작할 수 있는 일관된 방법 제공
  • JSON(JavaScript Object Notation) : 구조화된 텍스트 데이터의 교환을 위한 자바스크립트 표현식
  • XSL : XML 문서를 XML 또는 HTML 문서로 변환하기 위한 언어

 

XML(Extensible Markup Language)

  • HTML은 고정된 태그 집합이고, 디스플레이 기능에 치중ㅎ 다양한 비즈니스 데이터 표현 불가능하여 한계가 있음
  • 인터넷 환경에서 구조화된 문서를 전송 가능하도록 설계된 표준 마크업 언어
  • SGML의 서브셋 형태로 SGML과 HTML의 장점을 수용하여 만들어진 언어

XML 장점

  • 호환성
  • 독립성
  • 확장성
  • 다양한 포맷으로 변경 가능
  • 검색 능력의 향상

 

DOM

  • 파서가 문서 전체 또는 일부를 읽어서 메모리에 객체의 트리를 구성해서 xml 어플리케이션에 제공
  • SAX에 비해 읽기 성능은 낮지만 Random Access 및 쓰기 기능이 제공됨
  • 표준 인터페이스를 구현한 객체 기반 접근
반응형
반응형

객체지향(OOP - Object Oriented Programming) 이란?

  • OOP는 프로그래밍 패러다임 중 하나로 수많은 객체들간의 상호작용으로 하나의 프로그램을 완성해나가는 프로그래밍을 의미한다.
  • 현실세계에 존재하는 사물을 모델링하여 클래스 자료형 작성 후 객체(Object)를 생성한 후 객체를 이용해 프로그램을 작성하는 방법
  • 객체지향의 특성은 캡슐화, 상속, 추상화, 다형성

 

AOP(Aspect-Oriented Programming) 란?

  • AOP (Aspect-Oriented Programming) 는 관점 지향 프로그래밍으로 로그처리, 보안, 트랜젝션 관리 그리고 예외사항 처리 등의 코드를 단일 모듈로 각각 작성하고 필요한 시점에 핵심코드를 삽입하여 동작하게 하는 것

 

객체, 클래스, 메소드 란?

클래스(Class)

  • 유사한 특징을 지닌 객체들의 속성을 묶어 놓은 집합체
  • 동일한 속성과 행위를 수행하는 객체들의 집합

★ 클래스 선언 방법 ★

public class 클래스명 { 
	필드(Field); //메소드에서 필요로 하는 정보를 제공할 목적의 변수 : 변수선언 
	... 
	생성자(Constructor); //인스턴스 생성을 목적으로 하는 메소드 
	... 
	메소드(Method); //기능을 제공할 목적의 명령들의 모임 
	... 
}

 

메소드(Method)

  • 필드에 저장된 정보를 제어하기 위한 명령들의 모임 → 기능

 

오버로딩, 오버라이딩 이란?

메소드 오버로드(Method Overload)

  • 클래스에 동일한 이름의 메소드를 선언할 수 있는 방법
  • 동일한 기능을 제공하는 메소드는 같은 이름의 메소드명으로 선언하는 것을 권장
  • 같은 메소드 이름, 다른 매개변수로 다수의 메소드를 중복 정의

 

★ 오버로드 작성 규칙 ★

  • 클래스에서 동일한 메소드명으로 선언하며 메소드 파라메터의 갯수,자료형등을 다르게 선언
  • 메소드의 접근지정자, 반환형은 오버로드와 무관
  • 다형성 : 동일한 이름의 메소드를 호출해도 상태에 따라서 다른 메소드가 호출되어 기능 제공

→ 파라메터(매개변수)에 전달되는 값에 따라서 다른 메소드가 호출되서 실행

→ 메소드 오버로드, 메소드 오버라이드

→ 파라메터에 전달되는 값에 따라 다른 메소드 호출

 

메소드 오버라이딩(Method Overriding)

  • 같은 메소드 이름, 같은 매개변수로 다수의 메소드를 재정의 (덮어씌우기)

 

서블릿 생명주기

  1. init() 메소드
    → 서블릿 객체 생성 시 호출 (1번만 호출)
    서블릿에 대한 초기화 작업을 위한 메소드
    # 서블릿 클래스의 생성자는 서블릿 관련 초기화 작업에 부적절하다.

  2. service() 메소드(doGet() 또는 doPost())
    → 서블릿 객체를 이용(클라이언트 요청)시 호출되는 메소드(요청할때마다 호출)
    요청에 대한 응답처리를 하기 위한 메소드
  3. destroy() 메소드
    → 서블릿 객체 소멸 시 호출 (1번만 호출)
    서블릿에 대한 마무리 작업을 위한 메소드

 

GET 과 POST의 차이점

URL 요청 → GET 또는 POST

  • GET
    • URL에 QueryString을 사용하여 테이터 전송
    • 소용량 데이터 전송 또는 보안이 필요없는 데이터 전송
  • POST
    • http 프로토콜을 사용하여 데이터 전송
    • 대용량 데이터 전송 또는 보안이 필요한 데이터 전송

 

inner join, outer join

  • inner join
    • 두 테이블에서 특정 조건을 만족하는 결과만 반환한다. (교집합)
    • 두 테이블에서 존재하는 값만 반환한다. (null값은 포함되지 않는다.)
  • outer join
    • 두 테이블에서 기준이 되는 테이블은 모든 결과를 반환하고, 기준이 아닌 테이블은 조건에 만족하는 결과만 반환 (null 값 포함)
    • left join과 right join 으로 구분

 

DAO, DTO, VO 란?

DAO(Data Access Object)

  • DAO(Data Access Object)의 약자로 데이터베이스의 data에 접근하기 위한 객체이다.
  • DataBase 접근을 하기 위한 로직과 비즈니스 로직을 분리하기 위해 사용합니다.

DTO(Data Transfer Object)

  • DTO : DTO(Data Transfer Object)는 계층간 데이터 교환을 위한 자바빈즈를 의미한다.
  • 계층간 : Controller, View, Business Layer, Persistent Layer 등을 말하며 각 계층간 데이터 교환을 위한 객체를 의미한다.
  • DTO는 로직을 가지지 않는 순수한 데이터 객체이고 getter, setter 메소드만 가진 클래스를 의미합니다.

VO(Value Object)

  • VO : VO(Value Object)는 DTO와 혼용해서 쓰이긴 하지만 미묘한 차이가 있습니다.
  • VO는 값 오브젝트로써 값을 위해 쓰인다. 자바는 값 타입을 표현하기 위해 불변 클래스를 만들어서 사용하는데 불변이라는 것은 readOnly 특징을 가진다.
  • 이러한 클래스는 중간에 값을 바꿀 수 없고 새로 만들어야 한다는 특징이 있다.
반응형

 

젠킨스(Jenkins)란?

  • 빌드를 자동화 해주는 툴이다.
  • 빌드 : 서버에 올릴 수 있는 상태로 만드는 것
  • 기능 1 : 대쉬보드 기능 제공 - 여러가지 배포 작업의 상황을 모니터링 할 수 있음
  • 기능 2 : 배포 스크립트를 개발자 로컬에서도 실행할 수 있는데 젠킨스 프로그램을 띄워놓으면 스케줄링을 해준다.
  • 셋팅이 어렵고 잘 안되고 힘들어서 잘 안 쓰게 된다.

 

재귀

  • 재귀함수 : 자기자신을 호출하는 함수
  • 자신의 복사본을 호출하여 더 작은 문제를 풀게함으로써 문제를 해결한다.

 

로우 레벨 지식

  • 로우 레벨 프로그래밍 언어는 컴퓨터가 이해하기 쉽게 작성된 프로그래밍 언어로, 일반적으로 기계어와 어셈블리어를 말한다.
  • 실행속도가 매우 빠르지만 배우기가 어려우며 유지보수가 힘들다.
  • 기계어 : 0과 1의 이진수로 프로그램을 하는 기계어는 컴퓨터가 바로 읽을 수 있다
  • 어셈블리어 : 기계어를 보완하기 위해 나온 언어. 기계어와 명령어가 1:1로 대응되는 단어들로 구성되어 있다.
    1. 명령 실행 속도가 가장 빠르다.
    2. 매우 세밀하게 프로그램 해야한다.
    3. 어셈블리어는 하드웨어 특성을 탄다.
  • 어셈블리어 장점
    1. 프로그램의 실행 속도가 매우 빠르다.
    2. 프로그램의 크기가 매우 작다.
    3. 어떤 프로그램이라도 만들 수 있다.
    4. 어떤 기계에서도 사용 가능
  • 어셈블리어 단점
    1. 배우기가 어렵다.
    2. 큰 프로그램을 만들기 어렵다.
    3. 프로그래밍 시간이 오래 걸리고 디버깅이 어렵다.
    4. 제작된 프로그램이 하드웨어별 특성을 탄다.

 

멀티 스레드 지식

  • 하나의 프로세스를 다수의 실행 단위로 구분하여 자원을 공유하고 자원의 생성과 관리의 중복성을 최소화하여 수행 능력을 향상시키는 것을 멀티스레딩이라고 한다.
  • 하나의 프로그램이 동시에 여러개의 일을 수행할 수 있도록 해주는 것이다.

문제점

  • 멀티 프로세스 기반으로 프로그래밍을 할 때는 프로세스 간 공유하는 자원이 없기 때문에 동일한 자원에 동시에 접근하는 일이 없었지만 멀티 스레딩을 기반으로 프로그래밍할 때는 이 부분을 신경써줘야 한다.
  • 서로 다른 스레드가 데이터와 힙 영역을 공유하기 때문에 어떤 스레드가 다른 스레드에서 사용중인 변수나 자료구조에 접근하여 엉뚱한 값을 읽어오거나 수정할 수 있다.
  • 그렇기 때문에 멀티 스레딩 환경에서는 동기화 작업이 필요하다.
  • 동기화를 통해 작업 처리 순서를 컨트롤하고 공유 자원에 대한 접근을 컨트롤 하는 것이다.
  • 하지만 이로 인해 병목 현상이 발생하여 성능이 저하될 가능성이 높다.
  • 그러므로 과도한 락(lock)으로 인핸 병목 현상을 줄여야 한다.
  • 공유 자원이 아닌 부분은 동기화 처리를 할 필요가 없다. 즉, 동기화 처리가 필요한 부분에만 synchronized 키워드를 통해 동기화하는 것이다.
  • 불필요한 부분까지 동기화를 할 경우 현재 쓰레드는 락(lock)을 획득한 쓰레드가 종료하기 전까지 대기해야한다. 그렇게 되면 전체 성능에 영향을 미치게 된다.
  • 즉 동기화를 하고자 할 때는 메소드 전체를 동기화 할 것인가 아니면 특정 부분만 동기화할 것인지 고민해야 한다.

 

스레드와 프로세스 차이

  • 멀티 프로세스 : [데이터영역, 힙, 스택] 영역 모두를 비공유
  • 멀티 스레드 : [데이터영역, 힙, 스택] 영역 중 스택 영역만 비공유
  • 프로세스는 메모리에 적재(load)되어 실행되고 있는 프로그램을 말한다. 정적인 프로그램과 달리 프로세스는 실제 실행 중인 프로그램을 일컫기 때문에 동적이라고 표현하기도 한다.
  • 스레드는 프로세스 내에서 실행되는 흐름이다.
반응형

+ Recent posts