자바 문법 정리(~클래스,상속)
클래스의 구성 요소 = 데이터(변수) + 기능(함수, 메서드)
Static 키워드를 사용하게 되면 메모리에 변수가 남아있게 된다.
따라서 해당 클래스 전체에서 사용 가능하다
객체형은 ==으로 비교하지 않고 equals 메소드를 사용해야 한다.
그 이유는 referencing하는 곳의 데이터를 비교해주기 위함이다
![]() ![]() 동일한 메서드에서 패키지가 다른 경우에는 full path를 써줘야한다 |
String, 배열과 같이 메모리를 할당받는 변수들은 주로 null값으로 초기화를 시켜준다
null값을 할당해주면 주소값이 없다는 것을 의미한다
이 때 데이터가 올라간 영역은 heap 영역이 된다
메모리 관리와 관련해서는 "gabage collecter"라는 것을 알아야 한다
garbage collector의 우선순위는 사용중인 변수가 아닌 사용하지 않는 변수를 정리한다
따라서 객체의 연결고리를 끊어주기 위해서는 null로 초기화하여 garbage collector가 동작하게 하면 된다
new를 쓰지 않으면 변수는 메모리에 저장되는 것이 아닌 상수화되어 코드표 영역으로 이동한다
String 타입의 경우는 세미타입으로 메모리 관리 차원에서 new를 주로 쓰진 않는다
이와 같이 null로 초기화해주어 사용한다
Character.isAlphabetic(c) 같이 선언하진 않았지만 사용할 수 있는 클래스들이 있다. 이는 메모리 영역에 이미
떠 있는 것들이기 때문에 그냥 따로 메모리를 선언,해제할 필요가 없이 사용하면 된다
위 그림에서 String의 경우 앞서 언급했듯이 세미 타입이며 위와 같이 타입을 변경할 수도 있지만 이는 메모리 상으로 상당한 낭비가 일어난다. 따라서 String을 담을 수 있는 다른 메소드를 통해 선언하여 해당 문제를 해결한다
이와 같이 "StringBuffer" 클래스를 사용하여 객체를 선언해주면 이를 통하여
append 메소드와 같은 것으로 문자열이나 상수화된 값들을 자유자재로 넣을 수 있다.
또한 만약 타입이 일치하지 않을 시 toString() 메소드를 사용하여 타입을 String형으로 변경할 수 있다
Scanner 클래스의 경우는 자원 반납 메소드를 가지고 있다. 따라서 해당 클래스를 선언하여 객체를 생성해주고 나면 반드시 해당 메모리를 반납하여 release 시켜줄 필요가 있다
Scanner 클래스에서 제공하는 nextInt를 통하여 지정된 변수들에 값을 입력하여 할당할 수 있다
nextLine()을 사용하게 되면 엔터키를 소진할 수 있다
OUT이라는 것을 명시해놓고, 이중 FOR구문과 같은 다수의 반복문에서 사용하게 되면 한번에 모든 반복문을 빠져나올 수도 있다
배열은 위와 같이 선언하게 되며 무조건 reference로 메모리에 주소가 할당되기 때문에 처음에는 null로 초기화해주어야 한다 또한 reference에는 .연산자를 이용한 메서드를 사용하는 것이 가능하다
이와 같이 배열에 있는 값을 :을 이용하여 출력할 수 있다. 이 때 charAt은 문자열에서 해당 인덱스의 문자를 의미한다
또한 배열을 표시할 때는 []를 앞,뒤에 구분없이 넣을 수 있다
배열은 유틸 클래스 Arrays라는 것을 사용하여 배열 안의 숫자를 문자로 변경도 가능하며 다양한 메서드를 활용할 수 있다
이와 같이 배열을 할당하게 되면 num1과 num2는 같은 주소를 공유하게 되고 결과적으로 num1 또는 num2의 값이 변경되면 따라서 변경되는 결과가 나온다. 그에 반하여 clone 메서드를 사용하게 되면 주소가 공유되지 않아 값이 따라서 변경되지 않는다
이와 같이 System.arraycopy를 사용하게 되면 num4의 배열에서 0에서 num4의 길이만큼의 인덱스에 할당된 값이 num5에 할당되게 된다
위와 같이 배열을 선언할 때 2차원 배열의 경우 첫 번째 배열에 배열의 갯수를 할당하고 나머지에 대한 명시나 선언을
뒤로 할 수 있다.
이를 통해 0과 2의 인덱스에만 값을 할당하고 나머지는 null이 되게 하고 이를 출력할 수 있도록 하였다.
기존대로 그대로 출력하게 되면 null값이 있기 때문에 nullpointerexception이라는 오류 문구가 나올 것이다. 하지만, 이것을 처리해주기 위하여 위와 같이 null값이 할당되어 있을 때를 핸들링해주게 되면 출력값이 오류없이 나오게 된다.
위와 같이 메소드를 사용하게 되면 dialog의 문구가 나오며 값을 입력할 수 있도록 한다
클래스 생성 시
private,protected,public 키워드를 통한 변수를 선언하고,
생성자 함수, setter/getter, toString, hashCode&equals 등등으로 구성한다
위 구문들은 이클립스 내에서 Source -> 원하는 생성 메소드 함수들을 선택해주면 자동으로 처리된다
이와 같이 배열 객체를 선언하고 여러 개를 정의할 수도 있다.
이 때 위와 같은 형식으로 데이터를 출력해낼 수 있다
싱글톤 디자인 패턴
싱글톤 디자인 패턴을 이용하여 new를 통한 SingleTon 클래스에 대한 접근을 막고 getInstance 메서드를 호출하여 사용하게 한다. 이를 통해 한 클래스에 대해 오직 하나의 객체만 메모리에 할당될 수 있도록 한다
즉 위와 같이 여러 개를 선언했어도 하나의 메모리 주소에 s1,s2,s3가 공유된다
자바 클래스 내에서 super를 붙이게 되면 부모영역으로 올라가서 public 변수나 함수들을 찾게 된다.
또한 super 키워드는 static 키워드 내에서는 사용할 수 없다
위와 같이 extends 키워드를 사용하게 되면 Animal 클래스의 자식 클래스가 Dog 클래스가 된다
생성자에서는 Super 키워드를 통해 부모클래스에서 강아지과라는 문구를 호출하게 된다
is-a 관계
모든 객체의 Data Type은 부모가 될 수 있으며
부모 타입인 경우에는 접근 영역에 제한을 받게 된다 => 메모리 하단부에 접근이 허용되지 않는다
따라서, 메모리 하단부 접근을 하려면 다운캐스팅을 거쳐야한다
만약 이름이 같은 함수가 부모와 자식 클래스에 있다면 부모 영역에 있는 것을 접근할 수 없고
super를 이용하여 부모 클래스에 접근하여 사용하게 된다.
객체에 대한 예외처리 작업을 해주어야 하는 수도 있다. 접근할 수 없는 클래스에 접근하려고 하는 경우도 있기 때문에 데이터 타입을 확인해주어야 한다. 이 경우, Fish나 Dog가 a의 자식 클래스에 속하는지를 확인해주며, 자식 클래스인 경우 다운캐스팅해주는 구문을 넣어주었다. 이를 통해 오류를 없앨 수 있다
protected: 상속받은 클래스까지는 자원을 사용할 수 있게 해주는 키워드
abstract 메서드는 추상 클래스를 만드는 것으로, 메모리에 뜨지 않고 오버라이딩의 강제성을 주는 것이다
상속을 전제로 만들어지는 클래스로 미완성이기 때문에 절대 해당 추상 클래스로 객체를 생성할 수 없다
abstract <-> final 키워드는 서로 반대를 의미한다
abstract는 반드시 부모가 되어야만 하는 것이고, final은 부모가 될 수 없으며 메모리에 무조건 남게 된다 또한 오버라이딩이 금지된다.
Interface
비즈니스 레이어 구축을 담당하게 된다
식당의 메뉴판과 유사
이와 같이 설계할 수 있으며, 이 때 interface 내 함수들은 public이 생략되어 있는 상태이다.
또한 위와 같을 경우 해당되는 4개의 함수 모두를 구현하여 오버라이딩해야한다
자바의 polymorphism
보통은 interface 기술을 잘 시키며, 메소드는 하나이지만 다양하게 동작하는 경우 polymorphism(다형성)이라고 한다
예를 들어,
TV라는 interface가 존재하고, 이를 상속받은 클래스들이 여러 개 존재한다면 해당 클래스들을 사용하게 되면
객체로 TV 하나를 선언했지만 그의 자식 클래스들을 활용하여 다양한 기능들을 사용할 수 있게 된다.
이를 자바의 Polymorphism이라고 한다
클라이언트는 이와 같이 객체를 하나 선언하고 interface 클래스의 메소드에 해당하는 것들을 호출하여 원하는 결과를 도출해낸다
Command 디자인 패턴
내부적으로 spring 디자인 프레임워크에서 사용되는 패턴이다
interface에는 추상 메소드만 들어가게 되고, 해당 메소드를 구현하고 싶지 않은 자식 클래스가 생길 경우
default로 지정하여 특정 클래스만 기능을 확장시킬 수 있다.
위와 같이 추상 메소드로 구현하고 필요한 기능이 추가적으로 존재할 경우. default로 지정하여 모든 클래스에서 해당 메소드를 구현하지 않아도 되게 한다
클래스 내에는 위와 같이 inner 클래스를 선언할 수 있다. 이를 통해 외부 클래스의 자원을 마음껏 사용할 수도 있다.
이와 같이 이름없는 클래스를 이용하여 설계할 수도 있다. 선언부와 할당부를 함께 담아 코드 길이를 상당부분 줄일 수 있다는 장점이 있다.
has-a 관계
이와 같은 Point,Circle 클래스들 있을 때 "원은 점이다"라는 표현과 "점은 원에 포함된다"의 문장이 맥락상 맞는 표현이며 따라서 상속 관계로 표현할 수 없다. 이 때 has-a 관계를 사용하는데 has-a관계를 사용하게 되면 Point라는 클래스를 Circle의 내부 객체로 받아서 해당 변수를 클래스 내부로 활용하게 된다.