은행App
Java학습을 위한 간단한 은행 프로그램입니다.
- 동작
- “1.예금”선택시 금액 입력 후 예금액 합산하여 출력
- “2.출금”선택시 금액 입력 후 남은 금액 출력
- “3.잔액확인”선택시 계좌에 남은 금액 출력
- “4.종료”선택시 종료
- 위의 네개를 제외한 숫자가 들어오면 재입력 요청
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 |
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 | } |
주석의 설명을 같이 보며 이해해주시면 감사하겠습니다.
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> |
클래스의 특성중 정보은닉을 가장 잘 보여주는 메소드입니다.
보통 클래스의 멤버변수는 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선택자에 대해서 정리해보겠습니다.
1 | $("div").css("color", "red"); |
1 | $("#box").css("color", "blue"); |
1 | $(".box").css("color", "black"); |
1 | $("#list li").css("color", "yellow"); |
1 | $("list1 > li").css("color", "green"); |
1 | $("ul + ul").css("display", "none"); |
1 | $("div[title]").css("color", "gray"); |
1 | $("큰 부모태그의 id").find("*").attr('title'); |
1 | $("li:nth-child(even)").css("color", "white"); // even짝수, odd홀수 |
어노테이션은 JEE5(Java Platform, Enterprise Edition 5)부터 새롭게 추가된 요소입니다.
어노테이션으로 인해 데이터의 유효성 검사 등을 쉽게 알 수 있고, 이와 관련한 코드가 깔끔해지게 됩니다. 용도는 다양한 목적이 있지만 메타 데이터(데이터를 위한 데이터를 의미함 / 데이터에 대한 설명을 의미하는 데이터)의 비중이 가장 크다고 할 수 있습니다.
1 | @Example |
2 | // @ <- 기본적으로 컴파일러에게 어노테이션임을 알려줌 |
3 | // 뒤에 오는 example는 어노테이션의 이름 |
어노테이션은 클래스, 인터페이스, 메소드, 메소드 파라미터, 필드, 지역변수 위에 위치할 수 있습니다.
1 | @Example |
2 | public class Test{} |
@Override
@Depercated
@SupperssWarnings
@Functionallnterface
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
@Inherited
@Repeatable
@Target
어노테이션이 적용할 위치를 선택합니다.
종류
ElementType.PACKAGE
: 패키지 선언ElementType.TYPE
: 타입 선언ElementType.ANNOTATION_TYPE
: 어노테이션 타입 선언ElementType.CONSTRUCTOR
: 생성자 선언ElementType.FIELD
: 멤버 변수 선언ElementType.LOCAL_VARIABLE
: 지역 변수 선언ElementType.METHOD
: 메서드 선언ElementType.PARAMETER
: 전달인자 선언ElementType.TYPE_PARAMETER
: 전달인자 타입 선언여러 서비스를 로그인 한번으로 이용하도록 하는 기술
ex) 구글 드라이브를 사용하는 시나리오
이 직후에, Gmail을 사용하면 사용자 흐름은 아래와 같습니다.
SSO시스템을 구혈할 때의 가장 중요한 포인트는, IdP에서 SP로 사용자 인증 정보 전달을 처리할 때의 보안입니다. 이 부분은 여러 표준,프레임워크 등에 의해 구현할 수 있습니다. 그 중에 대표적으로 OAuth, JWT등이 있습니다.
[참고블로그](
public
, protected
, defalut
(아무것도 붙이지 않은 것), private
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 | } |
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 | } |
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 | } |
1 | abscract class AbstractTest { // 추상클래스(추상 메서드를 포함한 클래스) |
2 | abstract void move(); // 추상메서드(구현부가 없는 메서드) |
3 | } |
4 | |
5 | AbstractTest a = new AbstractTest(); //에러. 추상 클래스의 인스턴스 생성불가 |