개발자의 오르막
SW 심화과정 교육 4일차 본문
# 객체와 인스턴스의 차이
- 인스턴스는 하나
- 클래스는 여러개의 인스턴스
- 참조형 변수는 인스턴스를 가리킨다. // 클래스를 가리키는 개념은 존재하지 않는다.
- 인스턴스는 구체적인 대상,
- 일반적, 관념적인 대상을 클래스라 하고, 특정 객체를 인스턴스라고 한다.
# 메소드 오버로딩
# 조상, 자손 클래스에서 참조형 변수 이름이 중복되지 말아야 하는 이유
# 클래스가 하는 일
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 |