추상클래스

제어자 중에서 abstract라는 것이 있다. 이 제어자가 클래스 앞에 붙으면 추상클래스가 된다.

클래스를 설계도에 비유한다면 추상클래스는 미완성 설계도에 비유할 수 있다. 단어 뜻 그대로 완성되지 못한 채로 남겨진 설계도를 말한다. 미완성 메소드를 포함하고 있다는 의미이다. 추상메소드를 포함하고 있다는 것을 제외하고는 일반 클래스와 전혀 다르지 않다.

추상클래스는 그 자체로 클래스 역할을 다 하지 못하지만, 새로운 클래스를 작성하는데 있어서 바탕이 되는 조상클래스로서의 중요한 역할을 한다.

추상메서드

메소드는 선언부와 구현부로 구성되어 있다.
추상메소드란 서언부만 작성하고 구현부는 작성하지 않은 채로 남겨 둔 것이 추상메소드이다. 실제 내용은 상속받는 클래스에서 구현하도록 비워둔 것이다. 추상메소드 역시 키워드 ‘abstract’를 앞에 붙혀주고, 구현부가 위치할 {}대신 마침을 의미하는 ;을 작성한다.

추상클래스 사용이유

자손 클래스에서 추상메소드를 반드시 구현하도록 강요하기 위해서 이다. 상속받은 자손클래스에서는 메소드들이 완전히 구현된 것으로 인식하고 오버라이딩을 하지 않을 수 있기 때문이다.

Comment and share

Boxing과 UnBoxing

기본 타입의 값을 포장 객체로 만드는 과정을 박싱이라고 하고 반대로 포장객체에서 기본 타입의 값을 얻어내는 과정을 언박싱이라고 한다.

public class Wrapper_Ex {
    public static void main(String[] args)  {
        Integer num = new Integer(17); // 박싱
        int n = num.intValue(); //언박싱
        System.out.println(n);
    }
}

자동박싱과 자동언박싱

기본 타입 값을 직접 방싱, 언박싱하지 않아도 자동적을 박싱과 언박싱이 일어나는 경우가 있다. 자동박싱의 포장클래스 타입에 기본값이 대입될 경우에 발생한다.예를 들어 int타입의 값을 Integer클래스 변수에 대입하면 자동 박싱이 일어나 힙 영역에 Integer객체가 생성된다.

public class Wrapper_Ex {
    public static void main(String[] args)  {
        Integer num = 17; // 자동 박싱
        int n = num; //자동 언박싱
        System.out.println(n);
    }
}

Comment and share

Wrapper Class

자바의 자료형은 기본타입(primitive type)과 참조타입(reference type)으로 나누어진다. 기본타입은 char, int, float, double, boolean 등이 있고, 참조타입은 class, interface등이 있는데 프로그래밍을 하다 보면 기본 타입의 데이터를 객체로 표현해야하는 경우가 있다.
이럴 때 기본자료타입을 객체로 다루기 위해서 사용하는 클래스들을 래퍼클래스라고 한다.
자바의 모든 기본타입은 값을 갖는 객체를 생성할 수 있다. 이런 객체를 포장객체라고도 하는데, 그 이유는 기본타입의 값을 내부에 두고 포장하기 때문이다. 래퍼 클래스로 감싸고 있는 기본타입 값은 외부에서 변경할 수 없다. 만약 값을 변경하고 싶다면 새로운 포장 객체를 만들어야 한다.

래퍼클래스의 종류

기본타입 래퍼클래스
byte Byte
char Character
int Integer
float Float
double Double
boolean Boolean
long Long
short Short
래퍼 클래스는 java.lang 패키지에 포함되어 있는데, 다음과 같이 기본 타입에 대응되는 래퍼 클래스들이 있다. char타입과 int타입이 각각 Character와 Integer의 래퍼 클래스를 가지고 있고 나머지는 기본 타입의 첫 글자를 대문자로 바꾼 이름을 가지고 있다.

래퍼클래스
모든 래퍼클래스의 부모는 Object이고, 내부적으로 숫자를 다루는 래퍼클래스의 부모 클래스는 Number클래스이다. 모든 래퍼클래스는 최종 클래스로 정의된다.

Comment and share

업캐스팅

서브클래스는 슈퍼클래스의 모든 특성을 상속받는다. 따라서 서브 클래스는 슈퍼클래스가 될 수 있다.
즉, 서브 클래스가 슈퍼 클래스가 되는 것을 업 캐스팅이라고 한다.

class Person{
    String name;
    String id;

    public Person(String name){
        this.name = name;
    }
}

class Student extends Person{
    String grade;
    String department;

    public Student(String name){
        super(name);
    }
}

public class UpcastingEx{
    public static void main(String[] args){
        Person p;
        Student s = new Student("이재문");
        p = s; //업 캐스팅 발생

        System.out.println(p.name); //정상 컴파일
        Ststem.out.println(p.grade); //컴파일 오류
    }
}

Student로 인스턴스를 생성하고 Person 레퍼런스 타입으로 담았다.
다시 말해서 Person클래스의 멤버만 접근이 가능하고 Student의 멤버는 접근이 불가능하다.

다운캐스팅

서브 클래스가 슈퍼 클래스로 변했을 때 서브 클래스의 인스턴스는 잠시 가려져 있을 뿐 사라지지 않는다.
서브 클래스의 원래 특성으로 돌려 놓는게 다운 캐스팅이다.
다운 캐스팅은 업 캐스팅과 달리 명시적으로 타입을 지정해야 한다.
UpcastingEx클래스 부분만 수정한다.

public class DowncastingEx{
    public static void main(String[] args){
        Person p = new Student("이재문"); //업 캐스팅 발생
        Student s;

        s = (Student)p; //다운 캐스팅

        System.out.println(s.name); //정상 작동
        s.grade = "A"; //컴파일 오류
    }
}

Comment and share

getter, setter

private 변수를 외부에서 접근하게 하려면 public메소드를 제공한다.
값을 얻는 get()메소드를 getter, 값을 지정하는 set()메소드를 setter라고 한다.
외부 클래스에서 private멤버 변수에 직접 접근할 수 없지만,
public 메소드인 setter를 활용하여 값을 대입할 수 있다.

Comment and share

InnerClass

  • 클래스가 다른 클래스를 포함하는 경우, 내부에 포함된 클래스의 명칭

  • 파일 크기의 최소화, 보안, 성능 향상, 이벤트 처리 등을 쉽게 하기 위해 사용

  • 자바 클래스 구조를 더 조직화하고, 소스코드를 구현시 효율을 높일 수 있음

  • 내부 클래스가 생성되기 위해 외부 클래스의 객체가 반드시 필요

  • 내부 클래스는 정의되는 위치에 따라 멤버 클래스와 지역 클래스로 나뉨

  • 멤버클래스

    • 멤버 변수와 동일한 위치에 선언된 내부 클래스
    • static예약어가 붙은 static 멤버와 instance 멤버로 나뉨
    • 동일한 클래스 뿐아니라 다른 클래스에서도 활용 가능
    • 클래스의 멤버 변수와 성격이 비슷
  • 지역클래스

    • 메서드 내에 클래스가 정의되어 있는 경우
    • 지역클래스와 무명클래스로 나뉨
    • 활용 범위가 메서드 블록 내부로 제한되는 특징을 갖는 등 지역 변수와 성격이 비슷

Comment and share

LocalDate

로컬 날짜 클래스로 날짜 정보만 필요할 때 사용한다.
LocalDate currentDate = LocalDate.now();
: 컴퓨터 현재의 날짜 정보를 저장한다.
LocalDate targetDate = LocalDate.of(int year, int month, int dayOfMonth);
파라미터로 주어진 날짜 값을 저장한다.
|리턴타입|메소드(매개변수)|설명
|-|-|-|
|int|getYear()|년|
|Month|getMonth()|Month 열거 값(JANUARY, FEBRUARY, MARCH ..)|
|int|getMonthValue()|월(1, 2, 3 ..)|
|int|getDayOfYear()|일년의 몇 번째 일|
|int|getDayOfMonth()|월의 몇 번째 일|
|DayOfWeek|getDayOfWeek()|요일(MONDAY, TUESDAY, WEDNESDAY..)|
|boolean|isLeapYear()|윤년여부|

LocalTime

로컬 시간 클래스로 시간 정보만 필요할 때 사용하면 된다.
LocalTime currentTime = LocalTime.now();
: 컴퓨터의 현재 시간정보
LocalTime targetTime = LocalTime.of(int hour, int minute, int second, int nanoOfSecond)
파라미터로 주어진 시간 값을 저장한다.
|리턴타입|메소드(매개변수)|설명
|-|-|-|
|int|getHour()|시간|
|int|getMinute()|분|
|int|getSecond()|초|
|int|getNano()|나노초|

LocalDateTime

날짜와 시간 정보가 모두 필요할 때 사용하면 된다.
LocalDateTime currentDateTime = LocalDateTime.now();
: 컴퓨터의 현재 날짜와 시간 정보
LocalDateTime targetDateTime = LocalDateTime.of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond);
파라미터로 주어진 날짜와 시간값을 저장한다.

ZonedDateTime

ISO-8601 달력 시스템에서 정의하고 있는 타임존의 날짜와 시간을 저장하는 클래스이다. 결과는 2016-04-01T16:54:05.739+09:00[Asia/Seoul]와 같고, 맨 뒤에 +09:00[Asia/Seoul] 협정세계시와의 시차(+9시간)와 ZoneId(Asia/Seoul) 정보가 붙는다.
ZonedDateTime utcDateTime = ZonedDateTime.now(ZoneId.of(“UTC”));
UTC기준 현재 시각을 표시해준다.
ZonedDateTime seoulDateTime = ZonedDateTime.now(ZoneId.of(“Asia/Seoul”));
|리턴타입|메소드(매개변수)|설명
|-|-|-|
|ZoneId|getZone()|ZoneId를 리턴(Asia/Seoul)|
|ZoneOffset|getOffset()|UTC와의 시차를 리턴(+09:00)|

Comment and share

startswith()

startsWith() 함수는 대상 문자열이 특정 문자 또는 문자열로 시작하는지 체크하는 함수이다. 해당 문자열로 시작되는지 여부를 확인하고 boolean 에 맞춰 true/false 값을 리턴한다.

public class StartsWithTest{

    public static void main(String[] args){

        String startsWithT = "자바 코딩 테스트 ";

        System.out.println( startsWithT.startsWith("자바") );  // true
        System.out.println( startsWithT.startsWith("자바 ") );// true
        System.out.println( startsWithT.startsWith("자") );// true
        System.out.println( startsWithT.startsWith(" 자") );// false
    }
}

Startswith()는 공백도 취급한다.

endswith()

endsWith() 함수는 대상 문자열이 특정 문자 또는 문자열로 끝나는지 체크하는 함수이다. 해당 문자열로 끝나는 여부를 확인하고 boolean 에 맞춰 true/false 값을 리턴한다.

public class EndsWithTest{

    public static void main(String[] args){
         String endsWithT = "자바 코딩 테스트 ";

        System.out.println( endsWithT.endsWith("테스트") );  // false
        System.out.println( endsWithT.endsWith("테스트 ") );// true
        System.out.println( endsWithT.endsWith("트 ") );// true
        System.out.println( endsWithT.endsWith(" 테") );// false
    }
}

테스트 뒤에 공백이 있기 때문에 공백을 넣지 않으면 false가 나온다.

Comment and share

indexof

특정 문자나 문자열이 앞에서부터 쳐음 발견되는 인덱스를 반환하며 만약 찾지 못했을 경우”-1”을 반환한다.

public class IndexOfTest{

    public static void main(String[] args){

        String indexOfTestOne = "Hello world";

        System.out.println( indexOfTestOne.indexOf("o") );  // 4
        System.out.println( indexOfTestOne.indexOf("x") );  // -1
        System.out.println( indexOfTestOne.indexOf("o",5) );  // 7
    }
}

.indexof(“찾을문자”,”시작할 위치”) 이런식으로 사용하면된다.
시작할위치는 생략 가능하며 생략할 경우 0번째 부터 찾기 시작한다.

lastindexof

lastindexOf()는 특정 문자나 문자열이 뒤에서부터 처음 발견되는 인덱스를 반환하며 만약 찾지 못했을 경우 “-1”을 반환합니다.

public class IndexOfTest{

    public static void main(String[] args){

        String indexOfTestOne = "Hello world";

        System.out.println( indexOfTestOne.lastIndexOf("o") );  // 7
        System.out.println( indexOfTestOne.lastIndexOf("x") );  // -1
        System.out.println( indexOfTestOne.lastIndexOf("o",5) );  // 4
    }
}

사용법은 indexof와 같으며 뒤에서부터 찾기 시작한다.
오른쪽에서 몇번째 위치하는지를 반환하는게 아니라 말그대로 인덱스
즉, 왼쪽에서 몇번쨰 위치하는지를 인덱스로 반환한다.

Comment and share

String VS StringBuffer/StringBuilder

String과 StrungBuffer/StrungBuilder 클래스의 가장 큰 차이점은 String은 불변의 속성을 갖는다는 점이다.
그렇기 때문에 변하지 않는 문자열을 자주 읽어들이는 경우 String을 사용해 주면 좋은 성능을 기대할 수 있다. 그러나 문자열 추가, 수정, 삭제 등의 연산이 빈번하게 발생하는 알고리즘에 String클래스를 사용하면 힙메모리에 많은 가비지가 생성되어 힙메모리 부족으로 어플리케이션 성능에 치명적인 영향을 끼치게 된다.

이를 해결하기 위해 가변성을 가지는 StringBuffer/StringBuilder클래스를 도입했다.

StringBuffer VS StringBuilder

이 두클래스의 큰 차이점은 동기화의 유무이다. StringBuffer는 동기화 키워드를 지원하여 멀티쓰레드 환경에서 안전하다는 점이다. 참고로 String도 불변성을 가지기 때문에 마찬가지로 멀티쓰레드 환경에서의 안정성을 가지고 있다.

반대로 StringBuilder는 동기화를 지원하지 않기 때문에 멀티쓰레드 환경에서 사용하는 것은 적합하지 않지만 동기화를 고려하지 않는 만큼 단일쓰레드에서의 성능은 StringBuffer보다 뛰어나다.

Comment and share

Hyeon Soo Ahn

author.bio


author.job