<객체 지향 프로그래밍과 클래스>
객체 지향 프로그램 : 어떤 대상(객체)을 가지고 프로그래밍한다.
- 먼저 객체를 만들고 객체 사이에 일어나는 일을 구현하는 것
클래스 : 객체의 속성과 기능을 코드로 구현한 것.
- 객체를 클래스로 구현하는 것 == 클래스를 정의한다.
- 클래스의 속성은 클래스 내부에 변수로 선언한다. -> 멤버 변수
public class Student { // public : 접근 제어자, class : 클래스 만드는 예약어, Student : 클래스 이름
// 멤버변수
int studentID; // 학번
String studentName; // 학생 이름
int grade;
String address;
// 메서드(멤버함수) 추가
public void showStudentInfo(){
System.out.println(studentName + "," + address);
}
}
클래스 이름 규칙
- 자바에서 클래스 이름은 대문자로 시작
- 소문자로 시작한다고 오류발생하는건 아니지만, 개발자들 사이의 규칙
패키지 : 클래스 파일의 묶음
- 패키지를 만들면 프로젝트 하위에 물리적으로 디렉터리 생성
<메서드>
메서드는 함수(function)의 한 종류.
int add (int num1, int num2){ // int : 함수 반환형, add: 함수 이름, (int num1, int num2) : 매개변수
int result;
result = num1 + num2;
return result; // return 예약어
}
package classpart;
public class FunctionTest{
public static void main(String[] args) {
int num1 = 10;
int num2 = 20;
int sum = add(num1, num2);
System.out.println(num1 + " + " + num2 + " = " + sum + "입니다.");
}
public static int add(int n1, int n2) {
int result = n1 + n2;
return result;
}
public static int minus(int n1, int n2) {
int result = n1 - n2;
return result;
}
}
<클래스와 인스턴스>
package classpart;
public class Student {
int studentID;
String studentName;
int grade;
String address;
public String getStudentName(){
return studentName;
}
// 메인함수
public static void main(String[] args) {
Student studentAhn = new Student(); // Student 클래스 생성
studentAhn.studentName = "안연수";
System.out.println(studentAhn.studentName); // 안연수
System.out.println(studentAhn.getStudentName()); // 안연수
}
}
public class StudentTest{
public static void main(String[] args) {
Student studentAhn = new Student(); // Student 클래스 생성
studentAhn.studentName = "안승연";
System.out.println(StudentAhn.studentName);
System.out.println(studentAhn.getStudentName());
}
}
생성된 클래스의 인스턴스 == 객체
학생 > Student 클래스 > 인스턴스
package classpart;
public class StudentTest1 {
public static void main(String[] args) {
// 서로 다른 인스턴스 두개 생성 (student1, student2)
Student student1 = new Student();
student1.studentName = "안연수"; // 멤버 변수 사용
System.out.println(student1.getStudentName()); // 메서드 사용
Student student2 = new Student();
student2.studentName = "안승연";
System.out.println(student2.getStudentName());
}
}
인스턴스를 생성했을 때, 각 student는 studentID, studentName 등의 멤버 변수를 가지고 있고,
이 변수를 저장하기 위해 사용하는 메모리 공간이 힙 메모리.
Student studentAhn = new Student();
위와 같이 생성된 클래스를 studentAhn 변수에 대입하면, 인스턴스가 저장된 메모리를 studentAhn 변수가 가리킨다.
힙 메모리?
힙(heap)은 프로그램에서 사용하는 동적 메모리(dynamic memory) 공간을 말한다.
일반적으로 프로그램은 스택, 힙, 데이터 세 영역을 사용하는데, 객체가 생성될 때 사용하는 공간이 힙이다.
힙은 동적으로 할당되며, 사용이 끝나면 메모리를 해제해주어야하고,
C나 C++언어에서는 프로그래머가 직접 메모리를 해제해야 하지만, 자바에서는 가비지 컬렉터(garbage collector)가 자동으로 메모리를 해제한다.
각 클래스가 생성될 때 마다 (student1, student2) 인스턴스는 달느 메모리 공간을 차지한다.
-> 멤버 변수를 저장하는 공간이 매번 따로 생긴다
-> 그래서 클래스에서 선언한 멤버 변수를 달느 말로 인스턴스 변수라고 부름
용어 | 설명 |
객체 | 객체 지향 프로그램의 대상, 생성된 인스턴스 |
클래스 | 객체를 프로그래밍 하기 위해 코드로 만든 상태 |
인스턴스 | 클래스가 메모리에 생성된 상태 |
멤버 변수 | 클래스의 속성, 특성 |
메서드 | 멤버 변수를 이용하여 클래스의 기능을 구현 |
참조 변수 | 메모리에 생성된 인스턴스를 가리키는 변수 |
참조 값 | 생성된 인스턴스의 메모리 주소 값 |
<생성자>
package constructor;
public class Person {
String name;
float height;
float weight;
}
package constructor;
public class PersonTest{
public static void main(String[] args){
Person personLee = new Person(); // 생성자 : Person()
}
}
생성자는 클래스를 생성할 때만 호출한다.
생성자가 하는 일은 클래스를 처름 만들 때 멤버 변수나 상수를 초기화하는 것입니다.
생성자가 없는 클래스는 클래스 파일을 컴파일할 때 자바 컴파일러에서 자동으로 생성자를 만들어 준다. -> 디폴트 생성자 (default constructor)
- ex ) public Person() {} : 디폴트 생성자는 매개변수, 구현 코드 모두 없다.
package constructor;
public class Person{
String name;
float height;
float weight;
public Person() {} // 23번째 줄 new Person 에러 발생하지 않게 하기 위해 디폴트 생성자 추가
// pname을 매개변수로 입력 받아서 Person 클래스를 생성하는 생성자
public Person(String pname) {
name = pname;
}
}
===========================================================
package constructor;
public class PersoTest{
public static void main(String[] args) {
Person personLee = new Person(); // 오류 발생 : Person 클래스에 디폴트 생성자가 없기 때문
}
}
생성자 오버로드 : 클래스에 생성자가 두 개 이상 제공되는 경우
- 클래스에서 생성자를 여러 개 제공하면 이 클래스를 사용하는 코드에서 원하는 생성자를 선택해 사용 가능
package constructor;
public class Person {
String name;
float height;
float weight;
public Person() {} // 디폴트 생성자
public Person(String pname){ // 이름을 매개변수로 입력받는 생성자
name = pname;
}
public Person(String pname, float pheight, float pweight) { // 이름, 키 몸무게를 매개변수로 입력 받는 생성자
name = pname;
height = pheight;
weight = pweight;
}
}
==============================================
package constructor;
public class PersonTest {
public statis void main(String[] args) {
Person personKim = new Person(); // 디폴트 생성자로 클래스 생성 후 인스턴스 변수 값을 때로 초기화
personKim.name = "김유신";
personKim.weight = 85.5F;
personKim.height = 180.0F;
Person personLee = new Person("이순신", 175, 75); // 인스턴스 변수 초기화와 동시에 클래스 생성
}
}
<참조 자료형>
기본 자료형(int, char, float, double 등) 으로 선언하는 변수 외에,
클래스 자료형으로 선언하는 참조 자료형 변수가 있다.
package reference;
public class Subject{
String SubjectName; // JDK(Java Development Kit) 에서 제공하는 참조 자료형
int scorePoint;
}
public class Student1{
int studentID;
String studentName; // JDK(Java Development Kit) 에서 제공하는 참조 자료형
Subject korean; // Subject형을 사용하여 선언
Subject math;
}
<정보 은닉>
접근제어자(access modifier) : 예약어를 사용해 클래스 내부의 변수나 메서드, 생성자에 대한 접근 권한 지정 가능
package hiding;
public class Student{
int studentID;
private String studentName; // studentName 변수를 private으로 선언
int grade;
String address;
public String getStudentName(){
return studentName;
}
public void setStudentName(String studentName){
this.studentName = studentName;
}
}
public class StudentTest{
public static void main(String[] args) {
Student studentLee = new Student();
studentLee.studentName = "Tom"; // 오류 발생
System.out.println(studentLee.getStudentName());
}
}
- studentName 변수의 접근 제어자가 public 일 때는 외부 클래스인 StudentTest 클래스에서 변수에 접근할 수 있었지만,
private으로 바뀌면서 외부 클래스의 접근이 허용되지 않음
get(), set() 이용해서 접근하기
public class Student{
int studentID;
private String studentName;
int grade;
String address;
public String getStudentName(){
return studentName;
}
public void setStudentName(Stinrg studentName){
this.studentName = studentName;
}
}
public class StudentTest{
public static void main(String[] args){
Student studentLee = new Student();
// studentLee.studentName = "Tom";
studentLee.setStudentName("Tom"); // setStudentName() 메서드를 활용해 private 변수 접근 가능
System.out.println(studentLee.getStudentName());
}
}
접근 제어자 | 설명 |
public | 외부 클래스 어디에서나 접근 가능 |
protected | 같은 패키지 내부와 상속 관계의 클래스에서만 접근할 수 있고 그 외 클래스에서는 접근 불가 |
아무것도 없는 경우 | default 이며 같은 패키지 내부에서만 접근 가능 |
private | 같은 클래스 내부에서만 접근 가능 |
'Developer > JAVA' 카테고리의 다른 글
[JAVA] 배열과 ArrayList (0) | 2021.07.08 |
---|---|
[JAVA] 클래스와 객체2 (0) | 2021.06.28 |
[JAVA] 조건문, 반복문 (if, for) (0) | 2021.05.17 |
JAVA 변수 선언하기 (0) | 2021.05.14 |