개발자의 오르막

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

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

SW 심화과정 교육 4일차

계단 2019. 7. 18. 10:08

# 객체와 인스턴스의 차이

 

- 인스턴스는 하나

- 클래스는 여러개의 인스턴스

- 참조형 변수는 인스턴스를 가리킨다. // 클래스를 가리키는 개념은 존재하지 않는다.

- 인스턴스는 구체적인 대상,

- 일반적, 관념적인 대상을 클래스라 하고, 특정 객체를 인스턴스라고 한다.

 

# 메소드 오버로딩

 

 

 

# 조상, 자손 클래스에서 참조형 변수 이름이 중복되지 말아야 하는 이유

 

 

 

# 클래스가 하는 일

1. 참조형 변수를 선언할 수 있다.

2. 인스턴스를 생성할 수 있다.

3. 클래스와 클래스의 상속관계를 설정할 수 있다.

 

- 클래스 안에 있는 변수는 직접 엑세스할 수 없다.

- 변수를 활용하기 위해서 인스턴스를 생성해야 한다.

- 참조형 변수로 해당 인스턴스를 가리켜 멤버 변수, 멤버 함수를 활용한다.

 

# static이란? ( static 멤버 변수 선언)

 

 

- 인스턴스를 생성하지 않았음에도 temp 클래스의 i를 호출할 수 있다.
- 클래스를 하드 디스크에 저장, 하드 디스크의 파일을 메모리에 올린 후 액세스를 한다.
- VM  1) Test042를 메모리에 올리고, 다음에 temp를 메모리에 올린다.
- 인스턴스를 생성하지 않았어도 메모리를 할당받는다. (static 으로 선언된 것은 인스턴스가
   생성되기 전에 VM에서 temp 클래스가 올라올 때 메모리를 할당받는다.

 

→ 설명 정리

- 자바 실행환경은 클래스가 필요해지면 .class 파일을 메모리에 올린다.

   그 후에 인스턴스 생성이 가능하다.

- static으로 선언된 멤버변수는 .class 파일이 로딩되는 시점에 메모리를 할당받는다.

- non-static 멤버 변수는 인스턴스가 생성됬을 때 메모리를 할당 받는다.

   (인스턴스 갯수만큼 멤버변수 존재)

 

→ 따라서 static 멤버변수는 클래스 파일이 로딩되는 시점에 생성되기 때문에, 딱 하나만 존재한다.

    클래스는 딱 한번만 로딩된다.

 

# static 선언 함수의 규칙

 

 

- static은 인스턴스 생성 전에 존재한다. 따라서 static 멤버는 클래스명.심볼 형태로 접근한다.

- static 멤버 함수 안에는 non-static 한 멤버함수 멤버변수에 접근할 수 없다. (위의 i의 경우)

- 따라서 아예 문법적으로 컴파일을 못하게 막아버린 것.

 

 

# 복습

- class, instance, 로컬변수, 멤버변수, 참조형변수, 자료형변수, 생성자함수

- extends, inplements, interface, abstract-class, abstract-method

- overriding, overloading, casting

- 자료형변수_대입, 참조형변수_대입

- private(참조형 변수로 접근 불가), public, protected, friendly, 

- A t = new B();

 

- interface : abstract 메소드만 갖는 클래스

- abstract : 하나라도 abstract 메소드를 가지면 abstract 클래스로 선언

- abstract-method : method의 바디가 없다.

- casting : 자료형 변수의 캐스팅 : 형변환 : 큰 타입에서 작은 타입의 강제 형변환

                                                     작은 타입에서 큰 타입 자동 변환

- 참조형변수의 casting : 참조형변수가 가리키는 인스턴스 (자손 멤버변수 가리킴)

 

- friendly : 같은 패키지에서는 public, 다른 패키지에서는 private

 

# A t = new B();

- 조상 클래스의 참조형 변수로 자손 클래스 인스턴스를 생성하고, 

- 조상에서 선언된 멤버함수, 멤버변수만 호출이 가능하다.

- 만일 오버라이딩 된 함수를 호출한다면 이때는 오버라이딩 된 것이 호출된다.

- 멤버변수에는 오버라이딩 개념이 없어서, 자손클래스에서 재정의해도

   부모클래스 멤버변수가 호출된다.

 

 

# 플러그인과 웹브라우저

- IGreet ig = (IGreet)cls.newInstance();

- 웹 브라우저를 상속만 받아도 사용 가능

- 시스템이 만들어질 때, 인터페이스를 적절하게 구현하면, 웹브라우저 뒤에

  만들어도 상관 없음.

- 인터페이스를 활용해서 새로운 플러그인으로 재정의해도 웹브라우저를

   만질 필요가 없다.

- 따라서 A t = new B(); 가 인터넷을 횝씀

 

- 부모(웹브라우저)를 상속받은 변수, 함수를 활용해서 B(플러그인)에서

   메소드를 입맛대로 재정의

- 가져다 쓰는게 웹브라우저, 쓰임 당하는게 플러그인,

- 원래는 쓰임 당하는게 먼저 만들어져야 하는데, 인터페이스를 활용하면

   가져다 쓰는게 웹브라우저 먼저 생성

 

# 배열, 반복문

 

 

- 배열 : 동일한 형태의 기억장소가 연속으로 할당된 기억 공간
- 자바의 배열은 인스턴스이다. (다른 언어에 없는 특징)
- 배열을 가리키는 변수는 참조형 변수이다.
- i.length 는 배열의 멤버변수이고 길이를 의미한다.
- int[] i = {1,2,3,4}; 도 가능, 헌데 이건 new int[] 가 생략된 것

 

- break : 반복문을 탈출하다.

- continue : 반복문의 아래 코드는 수행을 건너뛰고 반복을 계속한다.

 

# 배열 최대값

 

 

- 한 번에 짜지말고, 기초 코드에서 발전시켜나가는 습관을 들여야 한다.

 

 

# Object 클래스

 

 

- 조상클래스를 지정하지 않으면 Object 로부터 상속받는다.
- java에서는 기본적으로 제공되는 클래스들이 많은데.
- java lang 패키지에 소속된 클래스는 import 없이 사용 가능하다.
   (가장 기본적인 클래스 모음, 막 가져다 써도 상관 없단 얘기)
- Object는 모든 클래스의 조상이다.
- Object 변수는 어떤 인스턴스도 가리킬 수 있다.

 

# getter, setter 함수

 

 

- 멤버변수는 private 궈장, 값을 읽을 때는 getter 함수를 제작해 쓴다.
- 인스턴스 내의 변수값을 읽기 전용으로 하려면? getter만 만들어준다.
- 인스턴스 내의 변수값을 바꾸고 싶을 때는 setter 를 쓰는 것이 예의

 

# String

 

 

- String은 java에서 new 없이 ""로 인스턴스가 생성이 가능한 클래스
- 참조형 변수의 비교는 동일한 인스턴스를 가리킬 때, true(동일한 null도 true)
- StringPool이라는 독특한 java의 구조가 나온다.

 

# StringPool

- 즉, 동일한 문자열을 가지면 인스턴스를 중복 생성하지 않고

  원래의 인스턴스를 활용한다.  → 웹 개발에서 효율성 증대

- ""를 만나면 VM은 StringPool를 뒤져서 없으면 만들고, 있으면 재활용

- 웹 프로그래밍에 유용하다. HTML 내용을 String으로 만들고 재활용하는 쪽이

   메모리 관리에 유용하다.

 

# Object 와 String의 관계

 

 

 

- Temp의 인스턴스가 생성되면, Temp의 멤버변수가 메모리를 할당받음.
- t는 Temp 인스턴스를 가리킴
- t.setData로 멤버함수를 호출하면, setData안의 Object i 는 로컬변수로 메모리를 할당받음
- i는 Helloworld 라는 string 인스턴스가 만들어지는데, 그 안의 object 인스턴스를 가리킨다.
- 결국 t.getData() 는 i로 Helloworld 안의 object를 가리킴으로 String 참조형 변수에 대입하려면
   캐스팅이 필요하다.
- 그리고  i는 로컬변수임으로 소멸한다.

 

# 캐스팅 필요 여부 (Temp 와 Temp2 비교)

 

 

- Temp는 모든 인스턴스를 저장할 수 있다. 다만 String을 받으려면 캐스팅해줘야 한다.

- Temp2는 String만 저장할 수 있다. 다만 캐스팅은 불필요하다.

 

인스턴스를 생성할 때, 매개변수로 들어가는 String 인스턴스와 Temp의 참조형 타입인

Object는 Object가 조상이기 때문에, 조상의 참조형 변수가 자손의 참조형 변수를 가리키려면

형변환을 해야 한다.

 

# general 타입 적용

 

 

- 인스턴스의 자료형을 동적으로 결정할 수 있다. : 제너릭의 개념

- general 타입 <>에 가능한 건 자료형 타입이 아닌 참조형 변수 타입이어야 한다.

- c++의 템플레이트 ... 가 이거랑 같다. C++은 자료형도 <> 안에 허용한다.

 

# Wrapper Class : 자료형 값을 감싸주는 가벼운 클래스

- int -> Integer 이라는 클래스

- double -> Double 이라는 클래스

 

 

 

# AutoBoxing, UnBoxing

 

 

- Integer i = 100; 는 컴파일러가 Integer i = new Integer(100); 로 자동 바꿈

- 값을 래퍼클래스에 대입하는 코드는 자동으로 인스턴스 생성해서 값을 감싸준다.

- 이것을 Auto Boxing 이라 한다.

- Object t = 200; Object 형 변수에 대해서도 AutoBoxing 은 동작한다.

- int j = i; 는 int j = i.intValue() 로 자동 변환하여 준다. (UnBoxing 이라 한다.)

 

# Command Pattern

 

 

- 일반적으로 자료값은 변수로, 동작은 함수로 만든다.
- 동작을 하나의 인스턴스로 수행하게 하는 경우가 있다.
- 이런 설계기법을 Command Pattern 이라고 한다.

 

* 단순 동작을 반복하는 매크로를 구현할 때 자주 쓰는 방법

 

- 쓰임당하는 쪽에서 내가 어떤식으로 쓰여졌으면 좋겠다는 의사표현을

  하도록 만들 때, 비어있는 인터페이스를 사용한다.

- 이것이 확장된 개념이 어노테이션이다.

- 조건 문에서 상속 받은 빈 인터페이스 이름을 기준으로 활용한다.

 

# this

 

 

# StringBuffer

 

 

- "apple" + "banana" 는 컴파일러가

   new StringBuffer().append("apple").append("banana").toString(); 를 의미

- 아래 코드는 한 줄 마다 new StringBuffer() 가 동작해야 한다.

- 헌데 위의 main의 예제는 하나의 StringBuffer만 동작한다.

- 메인 함수의 코드가 메모리 효율상 훨씬 좋다.

- 아래코드는 아래 처럼 계속해서 반복하게 된다.

   String l = ""

    l = l + "*";

    l = l + "*";

 

 

 

* java -verbosegc Test059

- 메모리가 부족할 때 메모리를 비우고 확보하는 일을 모니터링 하게 된다.

- 메모리 용량 차이 비교

 

- A

 

- B

 

 

# String 문자열 함수의 종류

 

 

- Node 제네럴 타입으로 linkedList 함수 짜기

- string indexOf와 동잃한 동작을 하는 거 구현하기 61번

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

SW 심화과정 D-4  (0) 2019.07.18
SW 제주 심화 교육 - 코드 패턴  (0) 2019.07.18
SW 심화과정 D-3  (0) 2019.07.17
SW 심화과정 교육 3일차  (0) 2019.07.17
SW 심화과정 D-1  (0) 2019.07.15
Comments