02.02 복습

2023. 2. 2. 10:32개발일지

객체

  • 자바는 속성과 동작을 각각 필드(field)와 메서드(method)라 부릅니다.

생성자

  • 인스턴스 변수(필드 값 등)을 초기화 시키는 역할을 한다.

wrapper

  • 산술 연산을 위해 정의된 클래스가 아니므로, 인스턴스에 저장된 값을 변경할 수 없습니다.
    (단, 값을 참조하기 위해 새로운 인스턴스를 생성하고, 생성된 인스턴스의 값만을 참조 할 수 있습니다.)
  • 8개의 기본 타입에 해당하는 데이터를 객체로 포장해 주는 클래스를 래퍼 클래스(Wrapper class)라고 합니다.
  • 각각의 타입에 해당하는 데이터를 인수로 전달받아, 해당 값을 가지는 객체로 만들어 줍니다.
기본 타입 래퍼 클래스
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean

(래퍼 클래스 중에서 Integer 클래스와 Character 클래스만이 자신의 기본 타입과 이름이 다름을 주의해야 합니다.)

 

Primitive type (기본형 타입)

  • 총 8가지의 기본형 타입(Primitive type)을 미리 정의하여 제공합니다.
  • 기본값이 있기 때문에 Null이 존재하지 않습니다.
    (만약 Null을 넣고 싶다면 래퍼 클래스를 활용합니다)
  • 실제 값을 저장하는 공간으로 스택(Stack) 메모리에 저장됩니다.
  타입 할당되는 메모리 크기 기본값 데이터의 표현 범위
논리형 boolean 1 byte false true, false
정수형 byte 1 byte 0 -128 ~ 127
short 2 byte 0 -32,768 ~ 32,767
int(기본) 4 byte 0 -2,147,483,648 ~ 2,147,483,647
long 8 byte 0L -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
실수형 float 4 byte 0.0F  (3.4 * 10 ^-38) ~ (3.4 * 10 ^38) 의 근사값
double(기본) 8  byte 0.0 (1.7 * 10^ -308) ~ (1.7 * 10^ 308)의 근사값
문자형 char 2  byte (유니코드) '\u0000' 0 ~ 65,535

 

Reference type (참조형 타입)

  • 기본형 타입을 제외한 타입들이 모두 참조형 타입(Reference type)입니다.
  • 빈 객체를 의미하는 Null값이 존재합니다.
  • 값이 저장되어 있는 곳의 주소값을 저장하는 공간으로 힙(Heap) 메모리에 저장됩니다.
  • 문법상으로는 에러가 없지만 실행시켰을 때 에러가 나는 런타임 에러가 발생합니다.
    (ex : 예를 들어 객체나 배열을 Null 값으로 받으면 NullPointException이 발생하므로 변수값을 넣어야 합니다.)
타입 예시 기본값 할당되는 메모리 크기
배열 (Array) int[] arr = new int[5]; Null 4 byte (객체의 주소값)
열거 (Enumeration)   Null
클래스 (Class) String str = "test";
Student sujin = new Student();
Null
인터페이스 (Interface)   Null

 

Method Signature(메서드 시그니처)

  • 자바 프로그래밍 언어에서는 메서드 명과 파라미터의 순서, 타입, 개수를 의미합니다.
    (return타입과 exceptions는 메서드 시그니처가 아닙니다)
  • 자바에서는 메서드의 정의에서 메서드 이름과 매개변수 리스트의 조합을 말합니다.
  • 메서드 시그니처가 중요한 이유는 오버로딩때문입니다.
//   public void wrapper(Integer index, String title, String contents) : Method Signature(메서드 시그니처)
    public void wrapper(Integer index, String title, String contents) {
        this.index = index;
        this.title = title;
        this.contents = contents;
        this.umm = umm;
    }

 

매개변수

  • 매개 : 둘 사이에서 양편의 관계를 맺어 줌, 변수 : 어떤 상황의 가변적 요인, 어떤 관계나 범위 안에서 여러가지 변할수 있는 수
  • 둘 사이에서 양편의 관계를 맺어주면서, 어떤 관계나 범위 안에서 여러가지 값으로 변할 수 있는 가변적 요소입니다.
// (Integer index, String title, String contents) : 매개변수
public void wrapper(Integer index, String title, String contents) {
    this.index = index;
    this.title = title;
    this.contents = contents;
    this.umm = umm;
}

 

인스턴스 변수(Non-static 멤버)

  • 클래스 내에 선언된 변수
  • 객체 생성 시마다 매번 새로운 변수가 생성됩니다.
  • 클래스 변수와 달리 공유되지 않습니다.

클래스변수(static 멤버)

  • 클래스 내에 static 키워드로 선언된 변수
  • 처음 JVM이 실행되어 클래스가 메모리에 올라갈 때 ~ 프로그램이 종료 될 때까지 유지
  • 클래스가 여러 번 생성되어도 static 변수는 처음 딱 한번만 생성됩니다.
  • 동일한 클래스의 모든 객체들에 의해서 공유됩니다.

출력 예시

// 출력 결과 1. 10, 28 2. 10, 28 1. 12, 400 2. 12, 28

 

클래스변수 사용 주의

  • 실제 static 멤버의 생성 시점은 JVM에 따라 다릅니다.
  • 보통 JVM은 필요한 대부분의 클래스를 처음부터 로딩하기 때문에 static멤버의 생성 시점은 JVM이 시작되는 시점이라고 할 수 있습니다.
  • 제약조건
    • static 메서드는 오직 static멤버만 접근 가능합니다
      • static 메서드도 static멤버와 로드되는 시점이 동일하기 때문에 객체가 생성되지 않은 상황에서도 변수를 사용 할 수 있어야 합니다.
    • this 키워드 사용 불가
      • this는 호출 당시 실행 중인 객체를 가리키는 래퍼런스인데 static메서드는 객체가 생성되지 않은 상황에서도 호출이 가능하기 때문입니다.

클래스 변수가 필요한 이유

  • 자바는 캡슐화 원칙에 따라서 C / C++과 달리 어떤 변수나 함수도 클래스 바깥에 존재할 수 없습니다. 따라서 전역변수나 전역메서드로 사용해야 할 경우 static을 이용해서 해결합니다.

 

member variable(멤버변수)

  • 메서드 밖에서 선언된 변수를 말합니다. 메서드 안에 선언된 변수는 지역(local) 변수라고 합니다.
멤버 변수
        객체 변수
                객체 속성 변수
                객체 참조 변수
        클래스 변수
        종단(final) 변수

멤버 변수의 구성

  • 멤버 변수 선언은 접근 한정자(public, private, protected)를 제외하고는 일반 변수의 구성과 동일합니다.
[public/private/protected] [static/final] 변수 타입 변수명;
  • 선언과 초기화 및 생성을 같이 할 수 있는데 코드로 보면 아래와 같습니다.
public int b = 0;
private MyClass myclass = new MyClass();
  • 멤버 변수명은 일반 변수명과 동일하게 소문자로 시작하는 것이 관례입니다.
    (단, static final으로 선언된 변수인 경우 모두 대문자를 하는 경우도 많습니다.)
private static final int MY_NUM;

(일종에 상수같은 역할을 한다고 생각하면 됩니다.)

 

Access control modifiers (접근 제어 한정자) - 멤버 변수

  • public
    • public는 모든 클래스에서 접근 가능합니다.
  • private
    • final은 한번 선언이 되면 변경이 불가합니다.
  • protected
    • public과 default의 중간쯤 됩니다. 같은 패키지 내에서는 default와 같이 접근 제한이 없지만, 다른 패키지에서는 자식 클래스만 접근을 허용합니다. 또한 protected 접근자는 멤버변수(필드), 생성자, 메서드에서만 상요가능합니다.
  • 접근 한정자 사용 안 함
    • 한정자를 사용하지 않고 선언된 멤버 변수는 같은 패키지 내의 클래스에서만 접근 가능합니다.

this

  • 인스턴스 자기자신을 가리키는 키워드입니다.
  • this를 통해 클래스 메서드 및 생성자에게 자기 자신의 데이터를 업데이트 하거나 조작할 수 있습니다.
  • 클래스 안에서 볼 수 있는데 클래스 메서드의 매개변수와 멤버변수의 식별자(변수이름)이 겹치는 경우가 발생할 때 유용하게 사용합니다.

this의 특징

  • 메서드 내에서만 사용됩니다
  • 객체 자신을 메서드에 전달하거나 리턴하기 위해 사용됩니다.
  • 객체 생성자 내에서 사용될 경우, 다른 생성자를 호출합니다.
  • 매개 변수와 객체 자신이 가지고 있는 변수의 이름이 같을 경우 이를 구분하기 위해 자신의 변수에 this를 사용합니다.
  • static 메서드에서는 사용할 수 없습니다.
  • this.멤버변수
    • 매개 변수와 객체 자신이 가지고 있는 변수의 이름이 같은 경우 이를 구분하기 위해 this를 붙입니다.
  • this(매개변수)
    • 생성자 내에서 다른 생성자를 호출합니다
  • this의 다음 예제 코드입니다.
public class thisClass {
    private int num;

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }
}

(이렇게 작성된 class는 다음과 같이 사용해볼 수 있습니다.)

package com.company;

    public class thisMain {

        public static void main(String[] args) {
            // write your code here
            thisClass this1 = new thisClass();
            this1.setNum(21);

            thisClass this2 = new thisClass();

            System.out.println(this1.getNum());
        }
    }

 

Regular Expression(정규표현식)

  • 정규표현식 혹은 정규식은 특정한 규칙을 가진 문자열의 집합을 표현하는데 사용되는 언어입니다.
  • 텍스트 편집기나 스크립트 언어에서 문자열의 검색과 치환을 위해 지원하고 있습니다.
  • 자바에서는 정규표현식을 작성하기 위해서 java.util.regex 패키지에 있는 클래스들을 사용하면 됩니다.
    (주로 Pattern 클래스와 Mathcher 클래스가 사용됩니다.)

Pattern 클래스

  • java.util.regex.Pattern 클래스는 matches() 메서드를 지원합니다. 이 메서드를 이용해서 특정 문자열이 주어진 정규식에 매칭 되는지를 테스트 해볼 수 있습니다.
    String pattern = "^[0-9]*$"; // 숫자만 등장하는지
    String str = "123321";

    boolean result = Pattern.matches(pattern, str);
System.out.println(result); // true

(matches() 메소드의 첫 번째 인자는 정규 표현식이고, 두 번째 인자는 정규표현식이 매칭되는지 확인하고자하는 문자열입니다. 만약 문자열이 정규표현식에 매칭되면 true가 return, 그렇지 않으면 false가 return됩니다.)

 

그 밖에 Pattern 클래스는 다양한 메서드를 지원합니다.

compile(String regex); 주어진 정규표현식으로부터 패턴 생성
matcher(CharSequence input); 대상 문자열이 패턴과 일치할 경우 true 반환
asPredicate(); 문자열을 일치시키는데 사용할 수 있는 Predicate 작성
pattern(); 컴파일된 정규표현식을 String 형태로 반환
split(CharSequence input); 문자열을 주어진 인자값 CharSequence 패턴에 따라 분리

 

Matcher 클래스

  • 문자열의 패턴을 해석하고 주어진 패턴과 일치하는지 체크할 때 주로 사용합니다. Pattern 클래스와 마찬가지로 Matcher 클래스는 생성자가 없으며, Matcher 객체는 Pattern 객체의 matcher() 메서드를 호출해서 얻습니다.
    Pattern pattern = Pattern.compile("^[0-9]*$");
    String str = "04234234";

    Matcher matcher = pattern.matcher(str);
System.out.println(matcher.find());

(pattern 객체의 matcher() 메서드를 호출해서 얻어온 Matcher 클래스를 이용한 코드입니다. Matcher 클래스에는 다양한 메서드가 정의되어 있습니다.

matches() 대상 문자열과 패턴이 일치하는 경우 true 반환
find() 대상 문자열과 패턴이 일치하는 경우 true 반환하고 그 위치로 이동
find(int start) start 인자로 받은 위치부터 매칭 체크
start() 매칭되는 문자열의 시작 위치를 반환
start(int group) 지정된 그룹이 매칭되는 시작위치 반환
end() 매칭되는 문자열의 끝 바로 다음 위치를 반환
end(int group) 지정된 그룹이 매칭되는 끝 바로 다음 문자 위치를 반환
group() 매칭된 부분 반환
group(int group) 매칭된 부분 중 group번째 그루핑 매칭부분을 반환
groupCount() 패턴내 그룹핑한 전체 갯수를 반환

 

정규표현식 문법

 

^ 문자열의 시작
$ 문자열의 끝
. 임의의 한 문자
* 문자가 0번 이상 발생
+ 문자가 1번 이상 발생
? 문자가 0번 혹은 1번 발생
[] 문자의 집합 범위를 나타냄
[0-9] : 숫자 (0부터 9)
[a-z] : 알파벳 (a부터 z)
앞에 ^가 나타나면 not을 의미
{} 횟수 또는 범위를 의미
() 소괄호 안의 문자를 하나의 문자로 인식
| or 조건
/ 확장 문자의 시작
\b 단어의 경계
\B 단어가 아닌 것의 경계
\A 입력된 시작부분
\G 이전 매치의 끝
\Z 입력의 끝이지만 종결자가 있는 경우
\z 입력의 끝
\s 공백문자
\S 공백문자가 아닌 나머지 문자
\w 알파벳이나 숫자
\W 알파벳이나 숫자를 제외한 문자
\d [0-9]와 동일
\D 숫자를 제외한 모든 문자

 

자주사용하는 정규표현식

^[0-9]*$ 숫자
^[a-zA-Z]*$ 영문자
^[가-힣]*$ 한글
\\w+@\\w+\\.\\w+(\\.\\w+)? 이메일 주소
^\d{2,3}-\d{3,4}-\d{4}$ 전화번호
^01(?:0|1|[6-9])-(?:\d{3}|\d{4})-\d{4}$ 핸드폰 번호
\d{6} \- [1-4]\d{6} 주민등록 번호
^\d{3}-\d{2}$ 우편번호

 

'개발일지' 카테고리의 다른 글

02.02 시험 풀이  (0) 2023.02.02
02.02 시험  (0) 2023.02.02
02.01 bus (객체지향)  (0) 2023.02.01
02.01 그리디 알고리즘 1 (JAVA)  (0) 2023.02.01
01.31 모의고사(JAVA)  (0) 2023.01.31