개발자의 오르막

SW 심화과정 교육 5일차 본문

교육과정 ( SW 개발자 심화과정 )/Java

SW 심화과정 교육 5일차

계단 2019. 7. 19. 11:21

# 상속관계 클래스의 캐스팅의 이해 - instanceof

 

 

# 자료형 타입의 연산

 

 

- c 는 정수값 0은 false, 0이 아닌 모든 정수는 true
- if(100) → true
- 비교연산은 boolean 값을 리턴 : ==, !=, >, <, >=, <=
- 거의 모든 연산은 같은 자료형 끼리 가능 : int + int = int
   int / int : 나머지 자름,  double / int : 자동변환 되는 부분을 캐스팅한다.

 

# package

- 패키지가 지정된 클래스 컴파일 : javac -d[폴더] Test064A.java
  대상 폴더 아래에 패키지 이름으로 폴더 생기고, 그 아래에
   class 파일이 들어간다.
- 패키지를 선언하지 않으면 unnamed 패키지에 속하게 됨.
  사용시 제약이 많다.
- 현재 폴더를 패키지로 지정 : javac -d . Test064A.java
- 패키지는 클래스의 묶음, 파일 맨 위의 지정
   이 파일 안에 선언한 모든 클래스는 지정된 패키지에 속한다.

 

# package 폴더가 다른 경로가 있을 때 컴파일 방법

- 다른 패키지의 클래스는 반드시 명시해야 사용할 수 있다. (import) 필요
- 만일 그래도 클래스를 못 찾으면, 위치를 지정해야 한다.
   javac -classpath C:\A\Test064.java
   javac -classpath .;C:\A\Test064.java
   위치를 지정해줘야 import 하는 클래스파일을 찾을 수 있음
   .; 는 컴파일하고자 하는 대상의 현재 위치이다.  (;는 구분자)
- import 하고자 하는 패키지가 여러개일 때에는 위치를 모두 지정필요
   구분자 ;를 활용

- -classpath 옵션을 안주면 -classpath . 이 자동으로 붙는다.

- Test065A 의 멤버변수 i 가 접근되는지 살펴본다. : protected, friendly

 

# static initializer : 클래스가 로딩되는 시점에 호출

 

 

 

# Class.forName

 

 

- 클래스를 찾아내서 해당 클래스를 강제로 메모리에 로딩시킨다.

- 로딩시키는 클래스의 static initializer 가 동작한다.

 

- static은 클래스가 로딩됬을 때 생성된다.

- non static 멤버변수는 인스턴스가 생성됬을 때 생성된다.

- static한 멤버변수는 하나만 존재한다.

- static initializer 는 클래스가 호출됬을 때 동작한다.

- static 한 멤버함수는 non static 멤버변수를 활용할 수 없다.

  non static 멤버변수가 (생성이 되지 않았기 때문에)

- 생성자는 인스턴스 생성되는 시점에 호출한다.

- 클래스를 강제로 로딩시키는 것이 Class.forName이다.

 

 

 

# getMethod

 

 

- getMethods() : 클래스 안에서 선언된 함수에 대한 포인터들을 추출한다.

 

 

# command pattern 활용

 

- PrintStars

 

 

- javac -d c:\A\ PrintStars.java

 c:\A\ 안에 temp 패키지를 생성하고 그 위치에 PrintStars.class를 생성한다.

 

*@interface 는 빈 인터페이스에 사용하고, 이렇게 선언된 건 implements를

   안해도 연결된다.

   같은 패키지안의 모든 클래스에 적용

   한 자바파일에는 public class가 하나만 있어야 된다. (보통 main 메소드 있는 클래스) 

   

 

-Test067.java 

 

 

- javac -d C:\A\ -classpath C:\A\ Test067.java

- c:\A\ 안에 temp 패키지를 생성하고 그 위치에 Test067.class를 생성한다.

 컴파일 할 때 c:\A\ 안의 PrintStars 를 임폴트를 한다.

 

* commandpattern과 달리 class가 아닌 함수에만 어노테이션을 하니까

   다른 클래스에서 사용가능

 

 

-Test067_2.java 

 

 

- javac -classpath c:\A\ Test067_2.java 

→ 컴파일 할 때 c:\A\ 안의 PrintStars 를 임폴트를 한다.
- java -classpath c:\A\;. Test067_2

→ 실행할 때  c:\A\ 안의 PrintStars 를 임폴트를 한다.

 

- 클래스를 못찾으면 classpath 로 위치를 지정한다.

 

* getAnnotation( PrintStars.class ) 는 PrintStars 클래스를 갖고 있니

  anot 는 Annotation 을 가리키는 참조형 변수

 

  mtd는 Test067 클래스 print 함수를 가져와서 invoke를 쓴다.

  invoke 함수의 리턴값은 Object로 가져와서

  Integer로 캐스팅 후 int로 언박싱  

 

  #56 commandPattern 과 비교했을 때, 

    거기서는 PrintStars를 implementes 하고 있는 애들을 구분해서 조건

    (ls[n] instanceof PrintStars) 이 Annotation 역할을 함. 

    56은 클래스 자체를 함.

    어노테이션은 함수단위로 가능

    

   어노테이션 == NameTag


 

# ArrayList 와 LinkedList 의 비교

 

 

- ArrayList 속도가 빠르다. 내부적으로 배열을 이용한다.
- 배열을 써서 단순히 쌓는 속도는 빠른데, 중간 삭제시에는 비효율적이다.

 

 

- 반면 LinkedList 는 Node 를 이용하기에 단순하게 쌓는 속도는 느리다.

   중간에 추가, 삭제가 빈번한 경우에는 용이하다.

 

- 둘 다 List를 상속한다. List를 상속받은 클래스는 특징이 존재한다.

   중복되는 것을 허용한다. 검색 시에 들어간 순서대로 출력된다.

   (즉, 순서대로 보관한다.)

 

# TreeSet 

 

 

 

- Set 인터페이스를 상속받은 것 : TreeSet, HashSet
- 공통특징 : 순서 개념이 없다.
- 중복 허용하지 않는다.
- 검색속도가 List 보다 월등

- TreeSet : 트리를 이용하여 보관, HashSet 는 해쉬 알고리즘으로
                  기억 장소를 결정
- 같은 인터페이스를 상속받았기 때문에, 사용 방법이 똑같다.
  같은 함수이름으로 각각 메소드를 재정의 했기 때문이다.

 

# HashSet

 

 

# Map

 

 

- Map은 순서개념 없이 key = value 형태의 마치 사전과 같은
  형태로 저장합니다.
- put 함수로 저장, get 함수로 key에 해당하는 value 를 뽑아낸다.

- List , Set , Map 형태로 뭔가를 저장하는 형태를 흔히 Collection 이라한다.

 

- 각각의 중복여부와 순서 여부를 확인한다.

  : List 는 순서개념 O, 중복허용 O / Set, Map 은 순서개념 X, 중복허용 X

  : Map은 (Key, Value)로 저장

 

# Random

 

 

Math.random() : 0에서 1사이의 소수값을 랜덤하게 출력한다.
- 곱해서 캐스팅 하는 형태로 해서 정수를 발생시킬 수 있다.

 

 

# RuntimeException

 

 

- java 에서 각종 에러는 class 로 구현된다. 
  extends Exception, extends RuntimeException
- 코드 수행시 에러가 발생되면 해당 예외 클래스의 
  인스턴스를 throw한다.
- 발생된 예외를 적절하게 처리하지 못하면 프로그램은 종료한다.
- "예외는 함수 수행시에 발생되고, 함수에 그 사실을 명시한다."

 

# RuntimeException 과 Exception의 차이, Try catch 문

 

 

- RuntimeException 일 때는 컴파일 되지만 실행 때 안됨.
- Exception 일 때는 컴파일 안됨. 그러나 함수 뒤에 throws 붙이면 됨.
- 함수에서 에러가 발생할 수 있다면 그 사실을 선언부에 명시해야 컴파일 된다.
- throws FuelException 으로 선언된 함수를 호출할 때는
  반드시 에러가 발생할 수 있는 영역을 try{} 로 감싸준다.
- try에는 반드시 1개 이상의 catch 가 있어야 한다.
- 에러가 발생되면 에러 인스턴스를 throw 한다.
- catch( FuelException e )에 잇는 e 변수가 발생된 에러 인스턴스를 가리킬 수
  있으면 catch에 딸린 {...} 가 동작한다.
  ... 에는 에러를 수습할 수 있는 코드가 들어가는 것이 바람직하다.

 

- 조상의 참조형 변수는 자손의 인스턴스를 가리킬 수 있어서,

   Exception e 는 FuelException 을 가리킬 수 있다.

'교육과정 ( SW 개발자 심화과정 ) > Java' 카테고리의 다른 글

SW 심화교육 9일차  (0) 2019.07.23
SW 심화교육 8일차  (0) 2019.07.22
SW 심화과정 D-4  (0) 2019.07.18
SW 제주 심화 교육 - 코드 패턴  (0) 2019.07.18
SW 심화과정 교육 4일차  (0) 2019.07.18
Comments