프로그래밍에서 객체를 어떻게 생성할까? 클래스를 사용해 객체를 찍어낸다.
객체 생성
이때, String은 클래스이고 str은 객체 참조자이다.
str에는 주소 값이 들어있고, 이 주소 값을 따라가면 String으로 생성된 객체가 있다.
클래스 이름은 식별자 명명 규칙을 따른다.
식별자 명명(네이밍) 규칙
- 문자, 숫자, 특수문자(_, $)만 사용 가능
- 첫 문자는 문자나 특수문자만 가능(숫자 불가능)
- 자바 예약어 사용 불가능
- 대소문자를 구분함
- 공백 포함X, 길이 제한X
*클래스의 이름은 대문자로 명시한다(관례)
클래스 선언
위에서는 자바 lang패키지에 이미 존재하는 String클래스를 통해 객체를 생성했다.
public class MyClass {
}
MyClass라는 새로운 클래스를 선언하는 코드이다.
*접근제한자: 다른 외부의 클래스에서 해당 요소에 접근할 때 어느 정도 접근을 허용할 것인지에 대한 기술자
-접근제한자는 public, protected, default(package friendly), private이 있는데, 오른쪽으로 갈수록 더욱 엄격해진다.
자바에서는 파일 이름을 주요 클래스의 이름과 동일하게 정의해야 하므로, MyClass라는 클래스를 담은 파일의 이름은 MyClass.java로 정의해야 한다. 하나의 파일에는 주요 클래스와 부가 클래스들, 즉 여러 클래스가 존재할 수 있다.
*일반 클래스: 파일 이름과 동일한 클래스
*main: 자바 프로그램의 시작점
클래스 사용
클래스를 사용해서 객체를 만드는 것을 클래스를 인스턴스화한다고 표현하기도 한다.
main 함수에서 클래스를 객체화할 수 있다.
이때, MyClass 클래스를 new를 사용해 객체화하지 않고도 main 메서드를 실행할 수 있는 이유는, static으로 선언되면 (new를 사용해) 객체화하지 않고도 사용할 수 있기 때문이다.
클래스를 사용하려면 일단 클래스를 사용해 객체로 만들어야 한다 *static 예외
new는 객체로 만드는 명령어이다. new를 하면 생성한 객체의 주소가 반환되는데 이를 참조 변수에 보관한다.
MyClass mc = new MyClass()는 new MyClass()로 MyClass클래스의 객체를 생성했고, mc라는 참조 변수에 그 객체의 주소 값을 저장한 것이다. 이후 mc라는 참조 변수를 통해 해당 객체에 접근할 수 있다.
클래스 구성 요소
멤버는 클래스가 가지고 있는 요소이다.
객체의 상태에 대응되는 클래스의 구성 요소: 속성, 데이터, 필드, 멤버 변수, 인스턴스 변수
객체의 행위에 대응되는 클래스의 구성 요소: 동작, 메소드, 멤버 함수
+생성자, 접근 제한자
필드
사람은 이름과 나이라는 정보를 갖는다. 따라서 name, age를 필드로 선언한다.
필드의 선언은 중괄호{ } 안의 어디서든지 가능하다.
다만 생성자나 메소드 내에서 변수를 선언하면 이는 필드가 아닌 지역 변수가 된다.
자료형 | 디폴트 값 |
boolean | false |
char | \u0000 |
int, short, byte | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
객체 참조자 | null(아무것도 없음을 의미) |
지역 변수는 초기화를 하지 않으면 자동으로 초기화가 되지 않는다.
필드는 초기화를 하지 않아도 자동 초기화가 이루어진다(디폴트 값이 대입된다).
객체 참조자 뒤에 도트(.)를 사용하여 객체의 공개된 멤버(필드, 메서드)에 접근할 수 있다.
*참조 변수 == 객체 참조자
Person p1 = new Person()을 통해 Person클래스의 객체를 생성한다. p1은 참조 변수로 그 객체의 주소 값을 저장한다.
자바에서는 문자열을 사용하면 자동으로 String 클래스로 변환되므로, p1.name = "김지수"는 p1.name = new String("김지수")와 유사하다.
위의 코드에서 name필드는 String 클래스이다. name은 String 클래스의 참조 변수로, String 클래스의 객체의 주소 값을 저장한다.
p1 객체 내에 String객체가 있는 개념이다. name을 객체 내의 객체를 가리키는 참조 변수라고 이해하자.
메소드
반환형 함수명([ 파라미터 타입 파라미터명, ... ]) {
코드 ...
return 반환값;
}
void 함수명([ 파라미터 타입 파라미터명, ... ]) {
코드 ...
[ return; ]
}
*[ ]: 생략 가능
두 수를 더하는 메소드를 선언하자.
int add(int a, int b) { <= 선언부
int result = a + b; <= 구현부
return result;
}
선언부의 반환형(리턴 타입)에 맞게 결과 값을 반환해야 한다.
주의할 점은, 메소드가 반환 값이 있다면 모든 실행 흐름에서 반환문이 있어야 한다.
나이가 음수가 아닌 나이가 양수일 경우에는 어떠한 return문도 만나지 않기 때문에 컴파일 오류가 발생한다.
나이가 양수인 경우에는 곧바로 return문을 만나 나이를 반환한다.
모든 경우에 return문을 만나기 때문에 컴파일 오류가 발생하지 않는다.
반환형이 void로 선언된 메소드는 반환할 값이 없다는 의미다.
이러한 메소드도 반환 값이 없는 return문을 사용할 수 있는데, 메소드를 종료한다는 의미이다.
메소드 오버로딩
메소드의 이름이 같아도 파라미터의 개수, 파라미터 타입, 파라미터의 순서가 다르면 다른 메소드로 인식된다.
이때, 선언부가 같은 메소드인지 아닌지만 상관이 있다.
public int add(int a, int b)와 public long add(int a, int b) 메소드의 선언부 중 반환형이 각각 다르지만 같은 메소드로 인식된다.
즉, 반환형은 메소드 오버로딩의 적용을 받지 않는다.
생성자
- 생성자는 반환 값이 없는 메소드임
- 객체 생성 시 실행됨
- 생성자 이름은 클래스 이름과 동일함
- 오버로딩을 사용한 복수 선언이 가능함
- 생성자를 작성하지 않으면 디폴트 생성자가 자동으로 생성됨
- 생성자를 작성하면 디폴트 생성자는 생성되지 않음
new Student("학생1"); => Student(String name) 호출
new Student("학생1", 98); => Student(String name, int kor) 호출
new Student(87, "학생1"); => Student(int eng, String name) 호출
new Student("학생1", 98, 87, 73); => Student(String name, int kor, int eng, int math) 호출
new Student(); => 디폴트 생성자가 없으므로 컴파일 오류 발생
객체 생성 시 전달받은 파라미터에 대응되는 생성자가 실행된다.
'Java' 카테고리의 다른 글
메모리 영역 (0) | 2022.03.30 |
---|---|
객체 지향 프로그래밍이란? (0) | 2022.03.30 |
다차원 배열 (0) | 2022.03.29 |
배열 (0) | 2022.03.29 |
[반복문]for문, while문, do~while문 (0) | 2022.03.28 |