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메서드는 객체가 생성되지 않은 상황에서도 호출이 가능하기 때문입니다.
- static 메서드는 오직 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 |