<용어 정리>
객체 | 객체지향 프로그램의 대상, 생성된 인스턴스 |
클래스 | 객체를 프로그래밍 하기 위해 코드로 만든 상태 |
인스턴스 | 클래스가 메모리에 생성된 상태 |
멤버 변수 | 클래스의 속성, 특성 |
메서드 | 멤버 변수를 이용하여 클래스의 기능을 구현 |
참조 변수 | 메모리에 생성된 인스턴스를 가리키는 변수 |
참조 값 | 생성된 인스턴스의 메모리 주소값 |
<접근 제어자>
접근 제어자 | 접근 가능 범위 |
public | 외부 클래스 어디에서나 |
protected | 같은 패키지 내부 & 상속 관계의 클래스에서만 |
아무것도 없는 경우 | default 이며 같은 패키지 내부에서만 |
private | 같은 클래스 내부에서만 |
1. 객체 지향 프로그래밍과 클래스
1. 클래스란?
클래스는 객체의 속성과 기능을 코드로 구현한 것
- 클래스 외부에는 package 선언, import 문장 외 아무것도 선언X
- 클래스 이름은 대문자로 시작
(접근 제어자) class 클래스명 {
멤버 변수;
메서드;
}
2. 클래스 살펴보기
1. 클래스 속성을 구현하는 멤버 변수
멤버 변수는 클래스 내부에 선언하여 객체 속성을 나타내는 변수다.
- 멤버 변수 선언 시, 기본 자료형/참조 자료형으로 선언
기본 자료형 | int, long, float, double 등 |
참조 자료형 | String, Date, 개발자가 직접 만든 클래스(Student) 등 |
2. 클래스 기능을 구현하는 메서드
메서드(멤버 함수)는 클래스 내부에서 멤버 변수를 사용하여 클래스 기능을 구현한 것이다.
3. 패키지란?
패키지는 간단히 말하면 클래스 파일의 묶음이다.
패키지는 프로젝트 전체 소스 코드를 구성하는 계층 구조가 되고 이 계층 구조를 잘 구성해야 소스 코드 관리와 유지보수가 편리하다.
- 같은 이름의 클래스라도 다른 패키지에 속해있으면 다른 클래스다.(서로 연관이 없다)
- a 패키지의 Student 클래스의 실제 클래스 명 = a.Student
- b 패키지의 Student 클래스의 실제 클래스 명 = b.Student
3. 메서드
1. 함수 호출과 스택 메모리
함수를 호출하면 그 함수만을 위해 할당되는 메모리 공간을 스택(Stack)이라고 한다.
프로그램에서 여러 함수를 사용하는 경우에 함수를 호출한 순서대로 메모리 공간이 만들어지고 맨 마지막에 호출한 함수부터 반환된다. 즉, 함수 호출 순서와 반대로 스택 메모리가 해제된다.
- 지역 변수(함수 내부에서만 사용하는 변수)는 스택 메모리에 생성된다.
<자바의 이름 짓기 규약>
- 클래스명은 대문자로 시작
- 하나의 파일에 public 클래스는 단 하나(클래스가 여러개 있을 수는 O)
- public 클래스명과 자바 파일명은 동일
- 패키지명은 모두 소문자
- 변수, 메서드명은 소문자로 시작 & 낙타 표기법
4. 클래스와 인스턴스
1. 클래스 사용과 main() 함수
main() 함수는 자바 가상 머신(JVM)이 프로그램 시작을 위해 호출하는 함수다.
main() 함수를 갖고 있는 클래스가 프로그램의 시작 클래스가 된다.
클래스 내부에 만들지만 클래스의 메서드는 아니다.
<main() 함수에서 클래스를 사용하는 방법>
1) 우리가 만든 클래스 내부에 main() 함수 생성
2) main() 함수를 포함한 실행 클래스 외부에 생성
2. new 예약어로 클래스 생성하기
new 예약어로 생성자를 호출하여 대입하면 클래스가 생성된다.
클래스가 생성된다는 것은 클래스를 실제 사용할 수 있도록 메모리 공간(힙 메모리)를 할당 받는다는 뜻이다. 이렇게 실제로 사용할 수 있도록 생성된 클래스를 인스턴스라고 한다. 인스턴스를 가리키는 클래스형 변수를 참조 변수라고 한다.
Student student = new Student();
// 참조 변수: student
// new로 생성된 Student 클래스
3. 인스턴스와 참조 변수
객체란 의사나 행위가 미치는 대상이다.
클래스란 객체를 코드로 구현한 것이다.
인스턴스란 클래스가 메모리 공간에 생성된 상태이다.
- 참조 변수에 . 연산자를 사용하여 인스턴스의 멤버 변수, 메서드를 참조 할 수 있다.
student.name = "홍길동" // 참조 변수.멤버 변수
student.getName() // 참조 변수.메서드
4. 인스턴스와 힙 메모리
클래스 생성자를 하나 호출하면 인스턴스가 힙 메모리(heap)에 생성된다.
지역 변수는 스택 메모리에, 인스턴스는 힙 메모리에 생성된다.
클래스가 생성될 때마다 인스턴스는 다른 메모리 공간을 차지한다.
참조 변수는 힙 메모리에 생성된 인스턴스를 가리키고 힙 메모리에 생성된 인스턴스의 주소는 참조 변수에 저장된다.
Q. 힙 메모리란?
힙(heap)은 프로그램에서 사용하는 동적 메모리 공간이다. 객체가 생성될 떄 사용하는 공간으로 자바에서는 가비지 콜렉터가 자동으로 메모리를 해제해 준다.
5. 생성자
1. 생성자란?
생성자가 하는 일은 클래스를 처음 만들 때 멤버 변수나 상수를 초기화 하는것이다.
디폴트 생성자를 사용하는 경우 클래스를 생성한 후 인스턴스 변수 값을 따로 초기화하지만
매개변수가 있는 생성자를 사용하면 생성자 내부에서 변수를 초기화 할 수 있어 코드가 간결하고 사용하기 편하다.
1) 디폴트 생성자
디폴트 생성자는 생성자가 없는 클래스에서 컴파일러가 자동으로 만들어주는 생성자를 말한다.
디폴트 생성자는 매개변수가 없고 구현 코드도 없다.
2) 직접 구현한 생성자
인스턴스가 생성됨과 동시에 멤버 변수의 값을 지정하고 인스턴스를 초기화하기 위해 생성자를 직접 구현하여 사용한다.
- 생성자를 직접 추가하면 디폴트 생성자는 만들어지지 않는다! (필요시, 매개변수가 없는 생성자 직접 만들어야 함)
2. 생성자 오버로드
생성자 오버로드란 클래스에서 생성자가 2개 이상 제공되는 경우를 말한다.
- 필요에 따라 매개변수가 다른 생성자를 여러개 만들 수 있다.
- 경우에 따라 강제화하기 위해서 클래스에서 일부러 디폴트 생성자를 제공하지 않기도 한다.
- Student 클래스 생성시 학번이 꼭 필요한 경우
6. 참조 자료형
1. 참조 자료형이란?
참조 자료형은 개발자가 필요에 의해 만든 클래스를 사용할 수도 있고
JDK에서 제공하는 클래스(String 등)을 사용할 수도 있다.
7. 정보 은닉
1. 접근 제어자란?
객체 지향 프로그램에서는 접근 제어자를 사용해 클래스 내부의 변수나 메서드, 생성자에 대한 접근 권한을 지정할 수 있다.
2. getter(), setter() 메서드
private로 선언한 멤버 변수를 외부 코드에서 사용하기 위해서 public 메서드를 제공해야 한다.
getter()는 멤버 변수의 값을 반환한다.
setter(parameter)는 파라미터로 들어온 값으로 멤버 변수 값을 초기화 한다.
3. 정보 은닉이란?
객체 지향에서 정보 은닉은 클래스 내부에서 사용할 수 있는 변수나 메서드는 private로 선언하여 외부에서 접근하지 못하도록 하는 것을 말한다.
- 자바에서는 접근 제어자를 사용해 정보 은닉을 구현한다.
- 클래스의 멤버 변수를 public으로 선언하면 접근이 제한되지 않으므로 정보의 오류가 발생할 수 있다. 모든 변수를 private로 선언해야하는 것은 아니지만 필요시 private로 선언하여 오류를 막을 수 있다.
- 범위를 벗어난 값으로 초기화 될 수 있음
접근 제어자 | 접근 가능 범위 |
public | 외부 클래스 어디에서나 |
protected | 같은 패키지 내부 & 상속 관계의 클래스에서만 |
아무것도 없는 경우 | default 이며 같은 패키지 내부에서만 |
private | 같은 클래스 내부에서만 |
8. 연습 문제
https://github.com/ahah525/do_it_java/tree/master/src/chapter5
GitHub - ahah525/do_it_java
Contribute to ahah525/do_it_java development by creating an account on GitHub.
github.com
'Java > Do It! 자바 프로그래밍' 카테고리의 다른 글
[JAVA] 10. 인터페이스 (0) | 2022.05.07 |
---|---|
[JAVA] 09. 추상 클래스 (0) | 2022.05.06 |
[JAVA] 08. 상속과 다형성 (0) | 2022.05.04 |
[DoItJava] 07. 배열과 ArrayList (0) | 2022.05.04 |
[DoItJava] 06. 클래스와 객체2 (0) | 2022.05.03 |