
1. main() 메서드의 입력 매개변수
1-1. 매개변수 - String[] args
- 프로그램이 실행될 때 입력되는 값(즉, 전달되는 값)
- Debug Configuration으로 Argument를 지정한 상태에서 디버그 시 매개변수가 출력된다.
2. 타입 변환
2-1. 래퍼 클래스(Wrapper class)
- 원시 데이터 타입을 객체로 감싼 것이다.
- 타입 변환 시 사용하는 메서드를 제공한다.
2-2. 타입 변환하기
- 문자열 -> 정수: Integer.parseInt("String")
- 문자열 -> 실수: Double.parseDouble("String")
- 정수 -> 문자열: String.valueOf("Integer")
- 실수 -> 문자열: String.valueOf("Float")
3. String 클래스
3-1. 객체 생성하기
3-1-1. new 키워드 사용하기
- Java에서 권장하는 방법이다.
- String str = new String("Hello"); 와 같은 형식으로 선언
- 좌변은 Stack에, 우변은 Heap에 저장된다.
- 우변에서 String()은 생성자이고, Hello는 저장하는 값이다.
3-1-2. 문자열 리터럴 사용하기
- 문자열 값을 변수에 바로 할당하는 것이다.
- String str = "Hello"; 와 같은 형식으로 사용한다.
3-1-3. 메모리 구조에서의 설명
- String 클래스는 클래스 영역에 로드된다.
- str 변수는 Stack 영역에서 공간을 확보한다.
- "Hello" 값은 Heap 영역에서 공간을 확보한다.
- str 변수는 Heap 영역의 "Hello"값의 주소를 참조한다.
3-2. String 클래스의 특징
- 한번 정의된 문자열은 변경할 수 없다.
- 문자열 내용이 변경된다는 것은 새 문자열을 포함하는 객체를 생성해서 사용한다는 의미이다.
- 기존 객체는 제거된다.
- 문자열 리터럴을 바로 입력해서 객체를 생성하는 경우, 같은 문자열은 같은 객체를 공유한다.
- 참고)
- new 키워드를 사용해서 객체를 생성하면 항상 새 공간에 할당된다.
- 문자열 리터럴을 바로 할당하는 경우, 서로 다른 값이여야 서로 다른 공간에 할당된다.
- 문자열 리터럴로 할당하는 경우, 할당된 값은 JVM 메모리 공간의 String Constant Pool에 저장된다.
3-3. 문자열 결합
3-3-1. 결합 방식
- 문자열 + 문자열 방식
- 개별 문자열이 모두 Heap에 저장된다.
- 결합은 앞에서부터 2개씩 진행
- 각 결합 단계에서 생성되는 모든 문자열은 Heap 영역에 저장되어 다음 결합 단계에서 활용된다.
- 문자열 + 기본자료형 또는 기본자료형 + 문자열
- 기본 자료형을 문자열로 바꾸는 과정이 선행된다.
- 모든 피연산자가 문자열이 되면 문자열 결합 방식을 따른다.
4. 클래스
4-1. 정의
- 객체를 만들기 위한 설계도이다.
- 한 개의 클래스로 여러 개의 객체를 만들 수 있다.
- 자바에서 제공하는 객체지향 요소 중 하나이다.
- 클래스 선언 시에는 new 키워드와 생성자를 활용한다.
4-2. 클래스의 구조
4-2-1. 주요 구성
- 필드: 클래스의 특징(속성)을 나타내는 '변수'이다.
- 메서드: 클래스의 기능(함수)를 나타내는 요소이다.
- 생성자: 클래스의 객체를 생성하는 요소이다.
- 내부 클래스: 클래스 내부의 클래스이다.
- 필드, 메서드, 내부 클래스를 클래스 멤버라고 한다.
4-2-2. 구조
- package
- 주석을 제외한 요소 중 소스코드 파일 맨 위에 위치한다.
- 디폴트 패키지를 사용한다면 생략할 수 있다.
- import
- 타 패키지의 클래스를 사용할 때 필요한 구문이다.
- class 클래스명 { 구성 요소 }
- 외부 클래스이다.
- public 클래스 이외의 클래스로, public 키워드를 사용할 수 없다.
4-3. 포인트 연산자
- Java에서 Heap 영역에 직접 접근하기 위해 사용한다.
- 필드명을 활용하는 방법과 메서드명을 활용하는 방법이 있다.
- 사용 방법
참조변수명.필드명
참조변수명.메서드명()
4-4. 필드 vs 지역변수
4-4-1. 필드
- 클래스 범위에서 정의된다.
- 객체 인스턴스가 존재할 때 계속 존재한다(값이 유지된다)
4-4-2. 지역변수
- 메소드 내에 정의된다.
- 메소드가 사라지면 함께 사라진다.
4-4-3. 초기화가 되지 않은 경우
- 필드는 강제 초기화되어 0이 된다.
- 지역 변수는 강제 초기화되지는 않으며, 사용도 불가능하다.
4-5. 메서드
4-5-1. 구조
- 제어자 + 리턴 타입 + 메서드명 + 매개변수
- 리턴 타입은 void 혹은 자료형이다.
- 매개변수는 생략 가능하다.
4-5-2. 종류
- 리턴 타입이 void, 매개 변수가 없는 메서드
- 리턴 타입이 void, 매개 변수는 있는 메서드
- 리턴 타입은 있지만 매개 변수는 없는 매서드
- 리턴 타입이 있고, 매개 변수도 있는 메서드
4-5-3. return의 역할
- 리턴 타입이 있다면 반환하는 값(변수)을 의미한다.
- 리턴 타입이 없다면 메서드 종료를 의미한다.
4-5-4. 메서드 호출
- 클래스 외부에서 호출하기
- 해당 클래스로 객체를 먼저 생성해야 한다.
- 객체명.참조변수 형태로 호출한다.
- 클래스 내부에서 호출하기
- 동일 객체 내에서 메서드를 호출할 시, 객체 생성이 필요없다.
- 이 경우, 함수 이름을 호출한다.
- 단, static 키워드가 붙은 메서드는 static필드나 메서드만 호출할 수 있다.
- 호출 시 매개변수에 대한 권장사항
- 기본 자료형을 매개변수로 활용하는 경우, 값을 복사해서 사용한다.
- 참조 자료형을 매개변수로 활요ㅛㅇ하는 경우에는 배열 주소를 활용한다.
4-5-5. 메서드 호출 시 발생할 수 있는 보안 취약점
- public 메서드로부터 반환된 private 배열
- private 배열에 할당된 public 데이터
4-5-6. 그 외 메서드 관련 개념
- 메서드 시그니처
- 메서드를 구분하는 기준
- 메서드명 + 매개변수의 자료형
- 메서드 오버로딩
- 동일한 이름을 가지되, 매개변수의 개수와 자료형이 서로 다른 메서드를 같은 공간에 정의하는 것
- 가변 길이 배열 데이터를 매개변수로 활용하는 메서드
- 함수 선언 시 메서드명(자료형... 배열) 형태로 작성한다.
4-6. 클래스 구성요소
4-6-1. 내부 구성요소 - 생성자
- 객체 생성에 사용하는 요소
- 클래스의 필드를 초기화하기 위해 사용한다.
- 클래스명과 동일한 이름을 가지며, 리턴 타입이 없다.
4-6-1-1. 기본 생성자
- 생성자를 포함하지 않은 클래스에서 추가되는 생성자이다.
- 컴파일러가 자동으로 생성한다.
- 매개변수가 없고, 생성자 본문의 내용도 없다.
- 생성자를 직접 만든 경우에는 추가되지 않는다.
4-6-1-2. this 키워드
- 포함된 클래스의 객체를 가리키는 참조변수이다.
- 해당 객체의 값을 그대로 사용할 때 필요하다.
- 일반적으로 생략해도 컴파일러가 자동으로 추가한다.
4-6-1-3. this() 메서드
- 자신이 속한 클래스 내부의 다른 생성자를 호출하는 메서드이다.
- 반드시 생성자 내부에서, 생성자의 첫 줄로 사용해야 한다.
- 생성자 오버로딩을 지원하기 때문에, 생성자를 여러 개 만들 때 사용한다.
- 생성자를 사용하는 메서드 정의 시에는 사용할 수 없다.
4-6-2. 외부 구성요소 - 패키지
4-6-2-1. 목적
- 동일한 목적의 클래스를 묶어서 관리하는 것
- 클래스명의 충돌을 방지하기 위해 사용한다.
4-6-2-2. 이름 명명법
- 도메인을 거꾸로 뒤집은 형태로 사용한다.
- 클래스 호출 시 패키지명.클래스명 형태로 사용한다.
4-6-3. 외부 클래스
- public 클래스 외부에서 정의한 클래스
- 외부 클래스는 default 접근 지정자를 가지므로, 같은 패키지 내부에서만 사용할 수 있다.
4-6-4. 접근 지정자
4-6-4-1. 정의 및 사용 방법
- Java의 제어자 중 하나이다.
- 사용 범위를 정의하기 위해 사용한다.
- 클래스, 멤버(필드, 메서드, 이너 클래스), 생성자 앞에 작성한다.
4-6-4-2. 종류
- public: 동일 패키지와 다른 패키지의 모든 클래스
- protected: 동일 패키지의 모든 클래스와 다른 패키지의 자식 클래스
- default: 동일 패키지의 모든 클래스
- private: 동일 클래스
4-6-4-3. 클래스에서의 접근 지정자
- 클래스의 접근 지정자는 public과 default만 존재한다.
- 외부 클래스는 default 지정자를 가지기 때문에 동일 패키지에서만 사용할 수 있다.
4-6-5. static 제어자
4-6-5-1. 정의
- 클래스 멤버(필드, 메서드, 이너 클래스)에 사용하는 제어자
- static 제어자가 붙어있다면 정적 멤버라고 하며, 객체 생성없이 클래스명.멤버명으로 사용할 수 있다.
- static 제어자가 없다면 인스턴스 멤버라고 하며, 객체를 생성해사 사용한다.
- static 제어자가 붙는다면 객체에서의 고유 변수의 성격을 가진다.
4-6-5-2. static 변수의 값 변화
- static 변수의 값이 바뀐다면, 이후에 해당 변수를 호출한다면 변경된 값이 호출된다.
- 이는 static 변수는 여러 번 호출해도 항상 하나의 주소를 가리키기 때문이다.
4-6-5-3. 주의사항
- 정적 메서드 내에서는 정적 필드와 정적 메서드만 사용할 수 있다.
- this 키워드를 사용할 수 없다.
- 정적 필드를 초기화하기 위해서는 정적 초기화 블록을 사용해야 한다.
static {
초기화 내용
}
참고 자료 및 출처