ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 14일차 - 접근 수준 지시자, 캡슐화, static, public, 메소드 오버로딩, String 클래스
    AI 솔루션 개발자과정(Java, Python) 2022. 10. 27. 17:18

    접근 수준 지시자

    • public : 어디서든 접근이 가능하며 인스턴스를 생성 가능하다.
    • protected : 같은 패키지 또는 상속관계라면 같은 패키지가 아니더라도 인스턴스 생성이 가능하다.
    • default : 아무 것도 쓰지 않은 상태, 동일 패키지로 묶인 클래스 내에서만 인스턴스 생성이 가능하다.
    • private :  동일 클래스 내부에서만 접근 가능

    public과 default는 클래스 정의 대상이고, 모든 지시자는 인스턴스 변수와 메소드의 정의 대상이다.

     

     

    캡슐화

    연관 있는 메소드 또는 클래스를 하나로 묶어 캡슐처럼 만든다.

    다른 클래스는 몰라도 클래스들을 캡슐로 묶은 하나의 클래스만 알면 된다.

    클래스를 만들 때 코드는 간소화 해야한다.

    연관성 있는 3가지 클래스를 하나의 클래스로 묶고 한번에 호출 가능하도록 했다.

    캡슐화된 클래스를 호출하면 포함된 클래스를 출력할 수 있다.

     

     

     

    static 선언을 붙여서 선언하는 클래스 변수

     

    static을 붙여서 static변수를 선언하면, 선언된 클래스의 모든 인스턴스가 공유하는 클래스 변수가 된다.

    객체가 생성되기 전부터, 미리 메모리에 저장한다.

     

    클래스 내부 접근

    • static 변수가 선언된 클래스 내부에서는 이름만으로 직접 접근 가능하다.

     

    클래스 외부 접근

    • private으로 선언되지 않으면 클래스 외부에서도 접근 가능하다. 
    • 접근 수준 지시자가 허용하는 범위에서 접근 가능하다.
    • 클래스 또는 인스턴스 이름을 통해 접근 가능하다.

     

    클래스 변수는 생성자를 기반으로 초기화 하면 안된다. 이 경우 인스턴스 생성할 때 마다 값이 리셋된다.

     

     

    static 선언을 붙여서 선언하는 클래스 메소드

    단순 기능 제공이 목적인 메소드들인스턴스 변수와 관련 지을 이유가 없는 메소드들은 static으로 선언하는 것이 옳다.

    static으로 생성한 객체는 static으로 생성한 객체에만 참조할 수 있다.

    클래스 멤버 sayHello는 인스턴스 멤버 name을 참조할 수 없다.

    static은 객체가 생성되기 전부터 존재하기 때문에, 생성된 후 할당하는 name를 참조하면 오류가 발생한다.

     

     

    System.out.println 그리고 public static void main()

     

    System.out.println 에서 out 과 println의 정체는?

    System은 java.lang패키지에 묶여있는 클래스의 이름이다. 하지만 컴파일러가 다음 문장을 자동으로 삽입해 주므로 java.lang을 생략한다.

     

    out은 클래스 System을 통해 접근하므로 클래스 변수라는 것을 추측할 수 있다.

     

    println()은 out이 참조하는 인스턴스 메소드이다. 

    자바의 출력은 print와 println이 있다.

    print는 출력시 띄어쓰기를 하고, println은 줄바꿈(개행)을 실행한다.

     

    public static void main()

    main() 메소드가 public이고 static인 이유는?

    static인 이유는 인스턴스 생성과 상관없이 제일 먼저 호출되는 메소드이기 때문이다.

     

    public인 이유는 main 메소드의 호출은 JVM이 실행될때 시작되는 명령이기 때문에 외부로부터 시작되는 명령이다. 외부에서 접근하기 위해 public을 사용하며, 일종의 약속으로 이해하면 된다.

     

    또 다른 용도의 static선언

     

    static : 클래스 멤버로 선언하여 특징을 부여한다.

    • 한번 만들어지고 끝이다.
    • 모든 객체가 공유한다.
    • 접근 방법의 차이를 만든다.

     

    static 초기화 블록

    프로그램의 실행날짜를 저장하기 위한 변수 date를 static으로 생성하고, 이 date에 대입할 static블록을 생성한다.프로그램이 실행되면 인스턴스 생성과 상관없이 static변수가 메모리공간에 할당될 때 실행된다.

     

    static import 문

     

    static import문은 패키지나 클래스를 불러오는 import에 static을 붙인 문장으로 static 멤버를 사용할 때,클래스 이름을 생략할 수 있게 해주는 문장이다.

    import static으로 Math 패키지의 PI를 불러왔다.

    이 PI는 Math 클래스를 표시하지 않아도 구문상 오류가 없다.

    하지만 static을 지우고 import만 쓴다면 오류가 발생한다.

     

    클래스를 생략할 수 있는 이점이 있지만, 어떤클래스에 속해있는지 표시를 안하기때문에 추후에 코드가 길어지면 알아보기 힘들 수 있다.

    하지만 클래스 이름이 표기되면 명확하게 알아볼 수 있으니 꼭 필요한 부분에 사용하는 것이 좋다.

     

     

    메소드 오버로딩

    호출된 메소드를 찾을 때 참조하게 되는 두 가지 정보

      - 메소드의 이름

      - 메소드의 매개변수 정보

    따라서 이 둘 중 하나의 형태가 다른 메소드를 정의하는 것이 가능하다.

    메소드 오버로딩은 같은 이름의 메소드에 중복으로 정의하는 것을 의미한다.

    원래 자바에서는 한 클래스 내부에 같은 메소드를 둘 이상 가질 수 없다.

    하지만 매개변수의 개수나 타입을 다르게 하면, 하나의 이름으로 메소드를 작성할 수 있다.

    메소드 오버로딩을 사용함으로써 메소드에 사용되는 이름을 절약할 수 있습니다.

    또한, 메소드를 호출할 때 전달해야 할 매개변수의 타입이나 개수에 대해 크게 신경을 쓰지 않고 호출할 수 있게 됩니다.

    메소드 오버로딩은 객체 지향 프로그래밍의 특징 중 하나인 다형성(polymorphism)을 구현하는 방법 중 하나입니다.

    메소드 오버로딩의 대표적인 예로 println()을 들 수 있다. println() 메소드는 입력값이 어떤 문자열이던 별도의 변환작업 없이 출력이 가능하다.

     

     

     

    String 클래스

    string 인스턴스 생성의 두가지 방법.

    String str1 = new String("Simple String"); - new 키워드를 이용하여 참조변수를 만들고 참조변수에 대입하여 생성한다.

    String str2 = "The Best String"; - new 키워드를 사용하지 않고 (" ")따옴표로 감싸서 생성하는 방법은 같은 문자열에 한해서 동일 대상을 참조한다.

    두 방법 모두 인스턴스의 생성으로 이어지지만, 그 결과 인스턴스의 참조 값이 다르다.

    new를 사용하는 방법은 동일 내용을 생성하더라도 서로 다른 객체로 생성 되지만, new키워드를 사용하지 않고 따옴표로 감싸서 생성하는 경우 처음 생성한 대상은 정상적으로 생성되고, 다음에 생성하면 처음 생성된 객체를 참조한다.

    word 1과 2는 new키워드로 생성하였다. 3와 4는 따옴표로 감싸서 생성했는데 각각 등가 비교를 했을 때,

    1과 2는 다른 객체이고, 3과 4는 동일한 객체로 출력된다.

     

    string 인스턴스는 immutable 인스턴스이다.

    생성하고 나면 수정이 불가능하기 때문에 새롭게 작성하여 생성해야 한다.

    따라서 생성되는 인스턴스를 최소화 해야한다.

     

    string 인스턴스 기반 switch문 구성하기.

    switch문은 입력된 인수에 맞는 케이스를 찾아 실행하는 문장이다.

    String 클래스로 생성한 인스턴스를 입력했을 때, switch문의 인수로사용할 수 있다.

     

     

    String 클래스의 메소드

    문자열을 연결시키는 concat

    문자열을 연결시킨다.

     

    문자열을 비교하는 equals

    두 문자열이 같으면 true를, 다르면 false를 반환한다.

     

    compareTo

    두 문자열이 같으면 0(zero)을, 두 문자열 중 서로 상이한 글자가 나오면 ASC||의 코드값으로 비교한다.

    앞에 있는 글자의 코드가 낮으면 차이값 만큼 음수로 반환되고, 높으면 정수로 반환된다

    하지만 compareTo는 대소문자를 구분하기 때문에 대소문자 구분없이 비교하려면 compareToIgnoreCase

    를 사용한다.

    마찬가지로 equals또한 뒤에 IgnoreCase를 붙여 대소문자 구분없이 비교 가능하다.

     

     

    문자열의 일부 추출

    파이썬의 인덱스, 슬라이싱과 비슷하면서도 다르다.

    String str = "abcdef"; 라고 문자열을 생성하고,

    str.substring(x) substring 메소드를 통해 문자열을 추출하는데, 인덱스와는 다르게 입력값 x부터 추출하여 cdef를 추출한다.

    str.substring(x,y) 로 x부터 y까지 범위를 지정할 수 있다.

     

    기본 자료형의 값을 문자열로 바꾸는 valueOf.

    valueOf는 메소드 오버로딩이 되어 있어서, 입력할 기본 자료형은 모두 지원한다.

     

     

    문자열과 기본 자료형의 연산.

    concat은 문자열과 문자열을 연산하는 메소드여서 문자열과 기본 자료형을 연산할 수 없다.

    이 경우 valueOf 메소드를 같이 사용해서 concat(String.valueOf(~~))형식으로 사용하면 기본 자료형도 연산 가능하다.

     

    concat 메소드는 이어서 호출이 가능하다.

        String str = "AB".concat("CD").concat("EF");

    메소드 호출문 뒤에 메소드 호출을 또 이어서 쓰는 방식을 체이닝(chaining) 이라고 한다.

     

    문자열 결합의 최적화.

    String 클래스를 이용해서 문자열 결합을 할 때 문자열 인스턴스가 계속해서 생겨나는 것은 바람직한 현상이 아니다.

    따라서 이 경우에는 문자열 인스턴스 생성을 최소화 하면서 문자열을 결합할 수 있도록 StringBuilder 클래스를 사용하는 것이 좋다.

    첫번째 줄에 있는 문자열과 기본 자료형의 결합을 하게 되면 각 요소에 concat(String.valueOf())메소드를 체이싱해야 하는데, 이 경우 String Builder 클래스를 사용하면 길이도 줄이고, 생성되는 인스턴스 또한 1개로 줄일 수 있다.

     

    String Buffer는 기능적으로 String Builder와 완벽히 일치한다.

    생성자를 포함하는 메소드의 개수부터 메소드의 기능, 메소드의 이름과 매개변수의 선언 등 완벽히 일치하지만, 쓰레드 안전성이 불필요한 상황에서 String Buffer를 사용하면 오히려 성능의 저하만 유발하게 된다.

    그래서 등장한 것이 String Builder이다.

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

Designed by Tistory.