<<<인코딩, 디코딩>>>
인코딩encoding: 규칙에 맞게 부호화하다. 암호에서는 규칙에 맞게 변환시키는 것을 의미함
디코딩decoding: 인코딩 된 것을 되돌리다(복호화하다)
<<<아스키코드>>>
미국정보교환표준부호(영어: American Standard Code for Information Interchange), 또는 줄여서 ASCII(아스키)
키보드에 있는 자판 영문 알파벳, 특수문자 등을 숫자로 인식하는 코드
<<<parsing 파싱>>>
저장된 데이터를 저장 구조가 비슷한 다른 형식의 원하는 데이터형으로 변환하는 것. 형변환과는 다르다.
csv까지 자른다는 표현과 같다.
<<<캐릭터char>>>
char는 문자 데이터 타입이지만 필요에 따라 아스키코드 정수로 파악되기도 한다. 따라서 캐릭터와 정수의 연산이 가능하며 정수와 정수의 연산은 int 타입으로 묵시적 형변환이 일어나기 때문에 캐릭터와 정수연산을 한 결과값의 데이터타입은 int이다.
<<<return과 System.exit(0)>>>
return과 System.exit(0)은 메인메서드에서 쓰였을 경우 같은 결과를 출력한다. 둘 다 실행을 종료하는 것이다.
그러나 return은 자신이 포함되어 있는 메서드를 종료하는 키워드이고, System.exit(0)은 진행중인 process(application, main)를 끝내는 것이다.
System.exit(0);은 시스템 클래스 안에 있는 exit 메서드로 스태틱(클래스)메서드이기 때문에 클래스 이름으로 접근할 수 있으며 그러므로 상태값을 변경시키지 않는 상태와 무관한 메서드임을 알 수 있다.
<<class diagram>>>
UML로 클래스를 표현한 것과 클래스간의 관계를 말한다. 박스로 클래스를 표현, 맨 위 클래스 헤더에는 클래스 이름을 적는다.
<<<Realization>>>
실체화한다는 개념. interface class에서 강제한 메서드를 구현한다는 의미이다. 공유에서 extends를 키워드로 사용했던 것처럼 realization할 때에는 implements를 사용한다.
<<인스턴스 생성 막는 법>>
1. constructor 생성자에 private을 붙인다.
2. class를 abstract로 선언한다.(abstract method가 없어도 class에 abstract로 선언할 수 있다.)
<<<interface class 인터페이스>>>
interface는 realization을 지원하는 자바의 syntax이다.
abstract class는 상속받았을 때 그 안에 abstract 메서드를 반드시 overriding하도록 강제한다. abstract class안에는 abstract 메서드도 있지만 오버라이딩이 필수적이지 않은 공유하는 메서드도 있을 수 있다.
그러나 real world에서는 abstract class처럼 공유와 강요를 동시에 하는 객체도 있지만 만들 것을 강요만 하는 객체도 있다.
예를 들어 KS의 경우에는 KS를 인증받고자 하는 제품에게 반드시 기능()을 구현하라고 한다. 그러나 KS는 구현을 강제하기만 할 뿐 제품들이 KS에게서 공유받는 내용은 없다.
구현할 것을 강요만 하는 class를 pure abstract class라고 부르는데 이를 자바에선 interface class라고 한다.
interface class는 공유하는 내용이 없이 강요만 하는 클래스로, interface class를 구현한다면 반드시 그 안의 메서드들을 오버라이딩 해야한다.
interface class는 안에 있는 모든 내용이 abstract임을 내포하므로 그 안에 메서드를 설계할 때에는 abstract 키워드를 붙이지 않아도 abstract로 선언된다.
인터페이스 클래스는 공통되는 기능을 모듈화 하는 데 사용되는 클래스이다. 라디오, TV, 스피커를 모델링한다고 할 때 공통적으로 볼륨이라는 기능을 갖는다. 이 때 라디오, TV, 스피커의 모델링마다 abstract void volume(); 을 만들어주는 것보다 interface class volume을 만들어서 implements 구현 하도록 강제하는 것이 수정이 간편하고 재사용성이 높다.
인터페이스는 자바에서 단일상속만을 지원하는 기능을 보완한다. real world는 다중상속 관계이다. 적절한 예인지는 모르겠지만 나에게 외가와 친가가 있는 것 정도로 생각하면 어떨까. 다중상속에서는 헷갈리는 경우가 많이 발생한다. "할머니"라고 했을 때 외할머니인지 친할머니인지 명확히 해야 하기 때문이다.
자바는 단순하고 명확한 것을 지향하는 언어로 복잡한 다중상속이 아니라 단일상속만을 지원한다.
그러나 이를 인터페이스가 보완할 수 있는데, 상속은 하나의 클래스만 가능하지만 implement는 여러 클래스가 가능하기 때문이다.
[공유] [인터페이스클래스]
키워드: extends / implements
UML: 실선 화살표 / 점선 화살표
인터페이스 클래스에 선언된 필드는 따로 명시하지 않아도
로 선언된다. return data type은 설정(변경) 가능하다.
인터페이스클래스는 인터페이스클래스를 상속받을 수 있다.
<<<generalization>>>
is a 관계가 성립한다. 공유를 위해 extends 키워드를 사용한다. 일반적이고 추상화단계가 높은 클래스를 공유하고, 자기 클래스 안에 구체적인 필드와 메서드를 구현하는 관계. 구체적 클래스 is a 일반적클래스.
<<<realization>>>
interface class를 구현하는 것을 실체화 realization이라 한다. 키워드는 implements를 사용한다. 클래스이름 implements interfaceClass이름{}
implements할 때에는 반드시 interface class의 abstract method를 오버라이딩 해야한다.
<<<Dependency>>>
사용하는 관계이다. class A와 B는 generalization이나 realization 관계가 아니어도 사용할 수 있다.
class A를 선생님이라 하고 class B를 보드마카라고 하자. B클래스에는 사용하다(){ 잉크량-- } 이란 메서드가 있다.
선생님이 강의를 할 때 강의하다(){B b = new B(); b.사용하다;}를 이용해 보드마카를 사용할 수 있다. 세미나를 할 때는 세미나하다(){B b = new B(); b.사용하다();}를 이용하면 된다.
Dependency 관계는 A클래스와 B클래스가 "메서드 안에서 생성된 인스턴스"를 매개로 갖는 관계이며 메서드 실행이 종료되면 해당 인스턴스는 사라진다(버려진다).
<<<Association>>>
클래스 A의 필드에 클래스 B의 인스턴스를 생성하는 관계. A는 B의 인스턴스를 가지고 있으므로 A has a B 가 성립된다. B클래스의 필드나 메서드를 사용할 때마다 인스턴스를 생성할 필요 없이 인스턴스 식별자(this.식별자 도 가능)로 접근하면 된다. has a 관계, association 관계는 클래스에 인스턴스를 생성한 관계이므로 메서드가 실행되거나 끝나도 인스턴스가 사라지지(버려지지) 않고 계속 갖고가게된다.
<<Garbage>>
자바는 메모리 관리를 하지 않는 언어다. 메모리 관리는 JVM이 해 준다. 그 때 사용되는 개념이 garbage이다.
생성되어 메모리에 등재되어 있지만 식별성이 없어 참조(사용)할 수 없는 데이터를 garbage라 한다.
정확한 메커니즘은 모르지만(찾으면 알 수는 있지만 몰라도 됨) garbage collector가 garbage를 모으는 garbage collecting을 한다. 그래서 이 garbage를 erase 없애주는데 이 과정을 garbage collection이라 한다.
<<<local variable>>>
필드에 선언된 변수들은 자동 초기화가 된다. 숫자는 0으로, boolean 은 false로, reference data type은 null로 된다.
클래스에서 선언된 필드와 달리 메서드 안에서 선언된 변수를 local variable이라 한다.
local variable은 초기화 하지 않고 출력할 때에 초기화 되지 않았다는 오류가 발생한다.(초기화 하지 않고 선언만 했을 경우에는 문제가 없으나 그 변수를 사용할 때 문제가 발생한다)
그러므로 local variable을 선언할 때에 선언과 동시에 자동초기화 값으로 초기화 해 주는 습관을 들이자.
<<<null>>>
아무것도 참조하지 않는다.
아무것도 참조하지 않기 때문에 .operator를 사용할 수 없다. (. operator는 참조관계에 있을 때 어디를 무엇을 참조하고 있는지 쫓아가는 operator이기 때문이다)
null이 들어있는 변수에 .operator를 사용하면 null point exception 에러가 발생한다.
<<<Object class>>>
Object class는 자바의 최상위 클래스이다. API를 확인해보면 모든 클래스는 Object클래스를 extends 하고 있다.
개발자(사용자)가 만든 클래스도 컴파일 시 자동으로 Object class를 extends 하게 된다.(컴파일 시 자동으로 default 생성자가 만들어졌던 것처럼)
이를 통해 Object class에는 자바 클래스가 반드시 가져야 하는 것들이 들어있도록 모델링되었음을 알 수 있다.
<toString>
System.out.println(변수명); 을 수행한다면, 변수명 데이터타입 클래스의 toString 메서드를 호출한다.
reference data type은 class이고, 자바의 모든 class는 Object class를 extends한다.
만일 extends하는 과정에서 toString 메서드를 overriding 했다면 그 메서드가 실행되겠지만 어디에서도 toString을 재정의하지 않았다면 Object class의 toString이 호출된다.
Object class의 toString 메서드는 String 데이터타입의 getClass().getName() + "@" + Integer.toHexString(hashCode())를 return한다. 따라서 @앞에 클래스 이름, @뒤에 해쉬코드변환을 보여준다.
하지만
String str = "홍길동";
System.out.println(str);
을 하면 홍길동이 출력된다. 이는 String class에서 toString method를 변수의 String 값을 리턴하도록 overriding 했기 때문이다.
자바진영에서 제공하는 API의 80%는 toString 메서드를 재정의했다고 한다.
<equals>
B a = new B(1, "홍");
B b = new B(1, "홍");
이라면, == 를 이용한 reference data type의 비교는 false가 나올수밖에 없다.
왜냐면 a에 들어있는 내용은 B인스턴스를 메모리에 등재(생성)한 주소값 (편의상 x)이고, b에 들어있는 내용은 다시 B인스턴스를 메모리에 등재한 주소값 (편의상 y)이기 때문이다.
그러나 인스턴스의 상태값이 같은 경우를 판단할 경우가 생길 수 있다. 생성된 인스턴스 중 홍씨만을 모은다거나, 남자(주민등록번호가 1로 시작하는 사람?)을 모은다거나 하는 식이다.
이 때 equals메서드를 이용하면 된다.
System.out.println(a.equals(b))
우선 Object class에 있는 equals메서드를 보면 Object데이터 타입을 input으로 받아 (this == obj)를 리턴하게 했다. Object class의 equals메서드는 == 를 이용한 비교와 같은 값이 return된다. 왜냐하면 this에는 a인스턴스 생성 시 시스템 내부에서 만들어진 this 레퍼런스(즉 x)를 가리키고, obj는 b변수 안에 있는 주소값(즉 y)이기 때문이다.
그러나 주의해야 할 것은 B class를 만든 사람이 개발자(사용자)라는 것이다. 그러니 비교해야 할 값이 무엇인지 overriding 해 주어야 한다.
B클래스에 필드 no를 선언해줬다고 하자. 그리고 인스턴스 생성시 생성자에 의해no는 입력된 인트값으로 초기화된다고 하자.
boolean equals(Object obj){
return this.no == ((B)obj).no;
}
그러면 this 레퍼런스(x)의 no가 B 데이터타입으로 명시적 형변환 된 obj의 no와 같은지 비교할 수 있게 된다.
즉 equals 메서드는 상태값을 비교하기 위해 상징적 의미로 Object class에 만들어놓은 메서드로, 상태값 비교를 위해서는 무엇을 비교해야 하는지 overriding해주어야 원하는 값을 출력받을 수 있다.
<<<reference counter>>>
하나의 인스턴스가 여러 개의 식별성을 가질 수 있다.
A a = new A();
A b = a;
A c = a;
그러면 생성된 하나의 인스턴스의 주소값(편의상 x)을 a, b, c변수가 가지고 있는 것이다. a도 x를, b도 x를, c도 x를 가지고 있는 것이다. 이를 자바에선 reference counter라고 한다. x에 있는 인스턴스는 세개의 식별성을 가지고 있고, 다시 말하자면 reference counter가 3개인 것이다.
(1.3버전에서는 JVM에서 인스턴스의 reference counter가 0이면 garbage로 판단, garbage collector가 collecting해 지우는 collection 작업을 했었다.)
IT/공부