0%

은행App

Java학습을 위한 간단한 은행 프로그램입니다.

  • 동작
    • “1.예금”선택시 금액 입력 후 예금액 합산하여 출력
    • “2.출금”선택시 금액 입력 후 남은 금액 출력
    • “3.잔액확인”선택시 계좌에 남은 금액 출력
    • “4.종료”선택시 종료
    • 위의 네개를 제외한 숫자가 들어오면 재입력 요청

클래스

image

App파일

image

Console

image

instanceof 연산자

  • 참조변수의 형변환 가능 여부 확인에 사용. 가능하면 true반환
  • 형변환 전에 반드시 instanceof로 확인해야 함
    • 형변환이 가능한지 확인 -> 형변환
1
void doWork(Car c) {
2
  if (c instanceof FireEngine) {
3
    FireEngine fe = (FireEngine)c;
4
    fe.water();
5
  else if (c instanceof Ambulance) {
6
    Ambulance ab = (Anbulance)c;
7
   ...
8
  }
9
  }
10
}
1
FireEngine fe = new FireEngine();
2
System.out.println(fe instanceof Object); // true
3
System.out.println(fe instanceof Car); // true
4
System.out.println(fe instanceof FireEngine); // true

참조변수의 형변환을 사용하는 이유는 사용할 수 있는 멤버의 갯수를 조정하기 위함임

instanceof연산자는 참조변수를 형변환하기 전에 형변환 가능여부를 확인할 때 사용함

참조변수의 형변환

  • 사용할 수 있는 멤버의 갯수를 조절하는 것
  • 조상 자손 관계의 참조변수는 형변환 가능
  • 사용하는 멤버의 갯수를 줄이고 늘릴 수 있음
1
class Car{
2
  String color;
3
  int door;
4
  
5
  void drive() {
6
    System.out.println("drive, Brrrrrr");
7
  }
8
  
9
  void stop() {
10
    System.out.println("stop!");
11
  }
12
}
13
14
class FireEngine extends Car{
15
  void water() {
16
    System.out.println("water!");
17
  }
18
}
19
20
class Ambulance extends Car{
21
  
22
}
1
FireEngine f = new FireEngine();
2
3
Car c = (Car)f; // OK. 조상인 Car타입으로 형변환(생략가능)
4
FireEngine f2 = (fireEngine)c; // OK. 자손인 FireEngine타입으로 형변환(생략불가)
5
Ambulance a = (Ambulance)f;	// 에러. 상속관계X

예제

image

image

image

캡슐화와 접근제어자

  • 접근제어자의 사용이유
    • 외부로부터 데이터를 보호하기 위함
    • 외부에는 불필요한, 내부적으로만 사용되는, 부분을 감추기 위해서
1
// private로 접근을 제한
2
// 간접적인 접근은 허용함
3
public class TimeEx {
4
	private int hour;
5
	private int minute;
6
	private int second;
7
8
	public int gethour() {
9
		return hour;
10
	}
11
12
	public void sethour(int hour) {
13
		if (hour < 0 || hour > 23)
14
			return;										// 값을 보호
15
		else
16
			this.hour = hour; // 유효한 값이면 저장
17
	}
18
}

주석의 설명을 같이 보며 이해해주시면 감사하겠습니다.
image

HTML Table태그 사용법

  • 표는 table태그로 만듭니다.
  • 행은 tr태그로 만듭니다.
  • 열의 제목이 들어가는 셀은 th로 만듭니다.
  • 내용이 들어가는 셀은 td태그로 만듭니다.
  • 각 열의 의미에 따라 thead, tbody, tfoot태그로 구분지을 수 있습니다.
  • 가로로 이웃한 셀을 합칠땐 colspan속성을 사용합니다.
  • 세로로 이웃한 셀을 합칠땐 rowspan속성을 사용합니다.
  • 표 제목은 caption태그로 만듭니다.

예제

1
<!doctype html>
2
<html lang="ko">
3
  <head>
4
    <meta charset="utf=8">
5
    <title>HTML</title>
6
		<style>
7
      table {
8
        width: 100%;
9
      }
10
      table, th, td {
11
        border: 1px solid #bcbcbc;
12
      }
13
    </style>
14
  </head>
15
  <body>
16
    <table>
17
      <caption>제목</caption>
18
      <thead>
19
        <tr>
20
          <th></th>
21
          <th>Ipsum</th>
22
          <th>Ipsum</th>
23
					<th>Ipsum</th>
24
        </tr>
25
      </thead>
26
      <tbody>
27
      	<tr>
28
        	<th>Ipsum</th>
29
          <td>Dolor</td>
30
          <td>Dolor</td>
31
          <td rowspan="2">Dolor</td>
32
        </tr>
33
        <tr>
34
          <th>Ipsum</th>
35
          <td>Dolor</td>
36
          <td>Dolor</td>
37
        </tr>
38
        <tr>
39
        	<th>Ipsum</th>
40
          <td>Dolor</td>
41
          <td>Dolor</td>
42
          <td>Dolor</td>
43
        </tr>
44
      </tbody>
45
      <tfoot>
46
      	<tr>
47
        	<td colspan="2">Table Foot</td>
48
        </tr>
49
      </tfoot>
50
    </table>
51
  </body>
52
</html>

image

참고블로그

getter/setter

클래스의 특성중 정보은닉을 가장 잘 보여주는 메소드입니다.

보통 클래스의 멤버변수는 private로 접근제어자를 설정한 후 getter/setter를 통해서 멤버변수의 값을 변경, 호출하게 됩니다.

1
class Student {
2
  // 은닉된 멤버변수
3
  private String name;
4
  private int age;
5
  
6
  // 은닉된 멤버 변수에 값을 넣는 방법 -> 메소드를 사용
7
  public void setName(String name) { // set함수
8
    this.name = name;
9
  }
10
  public void setAge(int age) {
11
    this.age = age;
12
  }
13
  // 은닉된 멤버변수의 값을 읽는 방법
14
  public void getName() { //get함수 getter
15
    return name;
16
  }
17
  public int getAge() {
18
    return age;
19
  }
20
}
1
public class example_getter_setter {
2
  public static void main(String[] args) {
3
    Student s = new Student();
4
    s.setName("hongbeen");
5
    s.setAge(28);
6
    
7
    String name = s.getName();
8
    System.out.println("이름: " + name)
9
    int age = s.getAge();
10
    System.out.println("나이: " + age)
11
  }
12
}

Tip: getter/setter를 쉽게 만들 수 있는 단축키가 있습니다.

Alt + Shift + s를 누르고 Generate Constructor using Fields와 Generate Getters and Setters를 누르고 자신이 이용하고 싶은 멤버변수를 선택하면 금방 만들어집니다.

jQuery선택자

jQuery선택자에 대해서 정리해보겠습니다.

태그 선택자

1
$("div").css("color", "red");

아이디 선택자

  • id는 키역할을 하므로 특정 요소, 객체, 태그를 제어하기 위해서 사용합니다.
1
$("#box").css("color", "blue");

class선택자

  • class는 공통적인 속성을 가진, 즉 그룹핑되어 있는 요소들을 묶어서 제어하기 위해서 사용합니다.
1
$(".box").css("color", "black");

자식, 자속 선택자

  • list1이라는 id를 가진 태그안에 있는 li태그들을 모두 선택, 적용 depth 1이상
  • 바로 아래 자식태그만 건드리는것이 아닌 list1의 모든 자식들을 컨트롤
1
$("#list li").css("color", "yellow");
  • list1이라는 id를 가진 태그안에 있는 바로 1depth아래있는 자식들 중 li태그만 선택됨
1
$("list1 > li").css("color", "green");

형제, 인접 선택자

  • ul태그가 연속적으로 붙어있는 태그들을 숨긴다.
1
$("ul + ul").css("display", "none");

속성 선택자

  • div중에 title속성이 있는 태그들만 가져옴 활용할 여지가 많음
1
$("div[title]").css("color", "gray");
  • 모든 태그들(부모태그 자식중에서)중에서 title속성이 있는 모든 태그들을 가져오는 것
1
$("큰 부모태그의 id").find("*").attr('title');

기타

  • 짝수, 홀수
1
$("li:nth-child(even)").css("color", "white"); // even짝수, odd홀수

Java Annotation

Annotation이란?

어노테이션은 JEE5(Java Platform, Enterprise Edition 5)부터 새롭게 추가된 요소입니다.

참고: 블로그 블로그2

어노테이션으로 인해 데이터의 유효성 검사 등을 쉽게 알 수 있고, 이와 관련한 코드가 깔끔해지게 됩니다. 용도는 다양한 목적이 있지만 메타 데이터(데이터를 위한 데이터를 의미함 / 데이터에 대한 설명을 의미하는 데이터)의 비중이 가장 크다고 할 수 있습니다.

1
@Example
2
// @ <- 기본적으로 컴파일러에게 어노테이션임을 알려줌
3
// 뒤에 오는 example는 어노테이션의 이름

Annotation 선언위치

어노테이션은 클래스, 인터페이스, 메소드, 메소드 파라미터, 필드, 지역변수 위에 위치할 수 있습니다.

1
@Example
2
public class Test{}

Java에서 기본적으로 제공하는 어노테이션의 종류

  • @Override
    • 선언한 메서드가 오버라이드 되었다는 뜻입니다.
    • 만약 상위 클래스에서 해당 메서드를 찾을 수 없다면 컴파일 에러를 발생시킵니다.
  • @Depercated
    • 해당 메서드가 더 이상 사용되지 않음을 표시합니다.
    • 만약 사용할 경우 컴파일 경고를 발생 시킵니다.
  • @SupperssWarnings
    • 선언한 곳의 컴파일 경고를 무시하도록 합니다.
  • @Functionallnterface
    • Java8부터 지원되며, 함수형 인터페이스를 지정하는 어노테이션입니다.
    • 만약 메서드가 존재하지 않거나, 1개 이상의 메서드가 존재할 경우 컴파일 오류를 발생 시킵니다.

메타 Annotation

1
@Target(ElementType.METHOD)
2
@Retention(RetentionPolicy.RUNTIME)
3
public @interface CustomAnnotation {
4
  boolean isCheck() default true;
5
}

1, 2번은 어노테이션 선언에 쓰인 어노테이션은 메타 어노테이션이라 하며 이를 이용해 커스텀 어노테이션을 작성할 수 있게 됩니다. 메타 어노테이션의 종류에 대해 정리해보겠습니다.

어노테이션은 기본적으로 인터페이스 형태를 취하고 있으며, 단지 interface앞에 @ 표시를 해줍니다.

  • Retention

    • 자바 컴파일러가 어노테이션을 다루는 방법을 기술하며, 특정 시점까지 영향을 미치는지를 결정하니다.
    • 종류
      • RetentionPolicy.SOURCE: 컴파일전까지만 유효(컴파일 이후에는 사라짐)
      • RetentionPolicy.CLASS: 컴파일러가 클래스를 참조할 때까지 유효
      • RetentionPolicy.RUNTIME: 컴파일 이후에도 JVM에 의해 계속 참조가 가능
  • @Documented

    • 해당 어노테이션을 Javadoc에 포함 시킵니다.
  • @Inherited

    • 어노테이션의 상속을 가능하게 합니다.
  • @Repeatable

    • java8부터 지원하며, 연속적으로 어노테이션을 선언할 수 있게 해줍니다.
  • @Target

    • 어노테이션이 적용할 위치를 선택합니다.

    • 종류

      • ElementType.PACKAGE: 패키지 선언
      • ElementType.TYPE: 타입 선언
      • ElementType.ANNOTATION_TYPE: 어노테이션 타입 선언
      • ElementType.CONSTRUCTOR: 생성자 선언
      • ElementType.FIELD: 멤버 변수 선언
      • ElementType.LOCAL_VARIABLE: 지역 변수 선언
      • ElementType.METHOD: 메서드 선언
      • ElementType.PARAMETER: 전달인자 선언
      • ElementType.TYPE_PARAMETER: 전달인자 타입 선언

SSO(Single Sign On)

여러 서비스를 로그인 한번으로 이용하도록 하는 기술

용어

  • SP(Service Provider): 서비스 제공자, 어플리케이션
  • Idp(Identity Provider): SP들의 인증 관련 부분만 모아서 구현해 놓은 것(하나의 웹 서비스)

어떻게 동작할까?

ex) 구글 드라이브를 사용하는 시나리오

  1. 사용자가 SP(Service Provider/서비스 제공자)를 사용하려고 합니다.
  2. 사용자의 세션 정보가 SP(구글 드라이브)에 남아있지 않아서, SP는 사용자를 idP(구글 통합 로그인 페이지)로 redirect시킵니다.
  3. 사용자의 세션 정보가 IdP에 남아있지 않아서, 사용자는 IdP에서 로그인(또는 어떤 방식으로든 ‘인증’)합니다.
  4. 인증이 완료되면, IdP는 사용자를 SP로 다시 redirect시키며, 동시에 사용자의 ‘인증 정보’를 SP에게 전달합니다.
  5. 로그인 처리가 완료되어 구글 드라이브를 사용할 수 있습니다.

이 직후에, Gmail을 사용하면 사용자 흐름은 아래와 같습니다.

  1. 사용자가 SP(Gmail)을 사용하려 합니다.
  2. 사용자의 세션 정보가 SP에 남아있지 않아서, SP는 사용자를 IdP로 redirect 시킵니다.
  3. 사용자의 세션 정보가 IdP에 남아있습니다. 그러면 IdP는 사용자를 SP로 다시 redirect시키며, 동시에 사용자의 ‘인증 정보’를 SP에게 전달합니다.
  4. 로그인 처리가 완료되어 Gmail을 사용할 수 있습니다.

어떻게 구현할까?

SSO시스템을 구혈할 때의 가장 중요한 포인트는, IdP에서 SP로 사용자 인증 정보 전달을 처리할 때의 보안입니다. 이 부분은 여러 표준,프레임워크 등에 의해 구현할 수 있습니다. 그 중에 대표적으로 OAuth, JWT등이 있습니다.

[참고블로그](

제어자(modifier)

  • 클래스와 클래스의 멤버(멤버 변수, 메서드)에 부가적인 의미 부여
  • 접근 제어자: public, protected, defalut(아무것도 붙이지 않은 것), private
  • 제어자: static, final, abstract, native, transient, synchronized, volatile, strictfp
  • 하나의 대상에 여러 제어자를 같이 사용 가능(접근 제어자는 하나만)
1
public class ModifierTest {
2
  public static final int WHIDTH = 200;
3
  
4
  public static void main(String[] args){
5
    System.out.println("WIDTH="+WHIDTH);
6
  }
7
}

static - 클래스의, 공통적인

  • 멤버변수
    • 모든 인스턴스에 공통적으로 사용되는 클래스 변수가 됨
    • 클래스 변수는 인스턴스를 생성하지 않고도 사용 가능
    • 클래스가 메모리에 로드될 떄 생성
  • 메서드
    • 인스턴스를 생성하지 않고도 호출이 가능한 stiatic메서드가 됨
    • static메서드 내에서는 인스턴스멤버들을 직접 사용할 수 없음
1
// 객체 생성없이 사용 가능
2
class StaticTest {
3
  static int width = 200; //클래스변수
4
  static int height = 120; //클래스변수
5
  
6
  static { //클래스초기화블록
7
    //static변수의 복잡한 초기화 수행
8
  }
9
  
10
  static int max(int a, int b) { //클래스메서드
11
    // iv, instance 메서드 사용불가 이유: 객체를 생성 후 사용가능하기 때문
12
    return a > b ? a: b;
13
  }
14
}

final - 마지막의, 변경될 수 없음

  • 클래스
    • 변경될 수 없는 클래스, 확장될 수 없는 클래스
  • 메서드
    • 변경될 수 없는 메서드, final로 지정된 메서드는 오버라이딩을 통해 재정의할 수 없음
  • 멤버변수, 지역변수
    • 변수 앞에 final이 붙으면, 값을 변경할 수 없는 상수가 됨
1
final class FinalTest { // 조상이 될 수 없는 클래스
2
  final int MAX_SIZE = 10; // 값을 변경할 수 없는 멤버변수(상수)
3
  
4
  final void getMaxSize() { // 오버라이딩할 수 없는 메서드(변경불가)
5
    final int MS = MAX_SIZE; // 값을 변경할 수 없는 지역변수(상수)
6
    return MAX_SIZE;
7
  }
8
}

abstract - 추상의, 미완성의

  • 클래스
    • 클래스내에 추상 메서드가 선언되어 있음을 의미
  • 메서드
    • 선언부만 작성하고 구현부는 작성하지 않은 추상 메서드임을 알림
1
abscract class AbstractTest { // 추상클래스(추상 메서드를 포함한 클래스)
2
  abstract void move();	// 추상메서드(구현부가 없는 메서드)
3
}
4
5
AbstractTest a = new AbstractTest(); //에러. 추상 클래스의 인스턴스 생성불가
  • 추상클래스를 상속받아서 완전한 클래스를 만든 후에 객체 생성가능