5-1.
- 객체 지향 프로그래밍과 클래스
- 객체와 객체 지향 프로그래밍
- 객체 : 주문, 생산 , 관리 ,,,,(안보이는 것) + 사람 , 자동차,건물 (보이는것)
- 객체 지향 프로그래밍 : 어떤 대상(객체)을 가지고 프로그래밍하는 것
- 생활 속의 객체
- 절차 지향 프로그래밍
- 일어나는 일을 시간순으로 프로그래밍
- 객체 지향 프로그래밍
- 객체의 정의하고 객체 간 협력을 프로그래밍
- 절차 지향 프로그래밍
- 클래스
- 클래스를 정의한다
- 객체를 클래스로 구현하는 것
- 멤버 변수
- 클래스의 속성..
class Student { int studentID; //학번 String studentName; //학생 이름 int grade; // 학년 String address; // 사는 곳곳 }
- 클래스를 만들떄 class 예약어 사용
- 사용할 객체의 속성 > 클래스의 변수로 선언
- 모든 요소가 클래스 내부에 있음
- 클래스 명명 규칙
- 대문자 시작
- 코딩 컨벤션
- 코딩할 떄 읽기 쉽고 이해하기 쉽도록 정한 규칙
- 클래스를 정의한다
- 객체와 객체 지향 프로그래밍
05.2 클래스 살펴보기
- 클래스 속성을 구현하는 멤버 변수
class Person { String name; //이름 int height; //키 double weight; //몸무게 char gender; //성별 boolean married; //결혼 여부 }
- Person클래스의 멤버 변수로 이름 , 키 , 몸무게 , 성별 , 결혼 여부 ...
- 기본 자료형 , 또 다른 클래스형으로 선언가능
- 클래스형
- 객체 자료형 또는 참조자료형
- String, Date 같이 이미 JDK에서 제공하는 것 혹은 개발자가 직접만든 Student 나 Person 같은 클래스가 다른 클래스에서 사용하는 멤버 변수의 자료형일 수 있음
- 클래스 기능을 구현하는 메서드
- 멤버 함수
- 클래스 내부에서 멤버 변수를 사용하여 클래스 기능을 구현
class Student { int studentID; //학번 String studentName; //학생 이름 int grade; // 학년 String address; // 사는 곳곳 public void showStudentInfo() { System.out.println(studentName + " , " + address); } }
- 멤버 함수
- 패키지
- 클래스 파일의 묶음
- 프로젝트 하위에 물리적인 디렉터리가 생성됨
- 대분류별로 정리해서 유지보수 및 소스 코드 관리가 편함
- 패키지 선언
- 클래스 전체 이름
package kr.or.test
- 클래스 전체 이름
- 05.3 메서드
- 함수의 한 종류
- 함수란?
- 하나의 기능을 수행하는 일련의 코드
- 함수의 입력과 반환
- 이름 : 의미를 알 수 있는 단어를 사용하는 것이 좋다
- ex ) add,
- 파라미터 (매개변수)
- 함수의 입력으로 받는 변수
- 반환 값
- 함수를 수행한 후 결과로 되돌려주는 값
- 이름 : 의미를 알 수 있는 단어를 사용하는 것이 좋다
- 함수 정의
- 함수가 하는 일을 코드로 구현하는 것
int add(int num1, int num2){ int result; result = num1 + num2; return result; } //매개변수가 존재하는 함수 int getTenTotal(){ int i; int total = 0; for(i = 1;i <=10;i++){ total += i; } return total ; //1부터 10 까지 더한 값을 반환합니다 } //매개변수가 존재하지 않는 함수
void printGreeting(String studentName) { System.out.println("studentName = " + studentName + "님 안녕하세요?"); } //반환값이 없는 함수 void divide(int num1, int num2) { if (num2 == 0) { System.out.println("나누는 수는 0이 될 수 없습니다"); return; //함수의 수행 종료 } else { int result = num1 / num2; System.out.println(num1 + "/" + num2 + "=" + result + " 입니다"); } } // return으로 함수 수행을 끝내고 프로그램 흐름 중에 호출한 곳으로 다시 되돌아갈 떄도 사용이 가능하다
- 나누는 수가 0이라면 수행하면 안돼지!
- 이때 함수의 수행을 종료하는
예약어
return 을 사용합니다
- 함수 호출하고 값 반환
- 함수의 호출
- 함수를 사용하는 것
- 함수 구현하고 호출하기
class FunctionTest { public static void main(String[] args) { int num1 = 10; int num2 = 20; int sum = add(num1, num2); //함수 호출 System.out.println("sum = " + sum); System.out.println("========================"); } static int add(int n1, int n2) { // int result = n1 + n2; return result; //결과 값의 반환 } }
- 매개변수는 함수에서 새로 선언한 변수입니다.
- 함수를 호출할 때 사용하는 변수 이름과 호출되는 함수에서 사용하는 변수는 서로 다른 변수 > 이름이 달라도 상관없습니다
- 함수의 호출
- 함수 호출과 스택 메모리
- 함수 호출
- 메모리 공간의 할당
- 메모리 공간 : 스택(stack)
- main 함수 포함된 변수.... 저장할 메모리 공간 생성
- add 함수 호출시 add함수를 저장할 메모리 공간이 스택에 새롭게 생성
- add 함수 수행이 끝나면 >함수에 할당한 메모리 공간을 해제하는 과정이 수행됨
- Main() 함수안에서 사용하는 변수와 add라는 함수안에서의 변수는 서로 다른 메모리 공간을 사용하기에 이름이 서로 달라도 문제 없습니다
- 함수 내부에서 사용하는 변수 : 지역 변수
- 지역 변수는 스택 메모리에 생성
- 함수의 장점
- 함수를 사용하면 기능을 나누어 코드를 효율적으로 구현가능
- 기능별 함수 구현 : 같은 기능을 매번 코드로 만들지 않고 그 기능의 함수를 호출하면 편리합니다
- 하나의 함수에 하나의 기능!!!!!
- 클래스 기능을 구현하는 메서드
- 메서드
- 멤버 변수를 사용하여 클래스의 기능을 구현
- 함수에 객체 지향 개념이 포함된 용어입니다
class Student { int studentID; String studentName; int grade; String address; public String getStudentName() { return studentName; }//학생의 이름을 return! public Student(String studentName) { this.studentName = studentName; }//학생의 이름을 set! }
- 자바의 네이밍 규약
- 클래스 이름은 대문자
- public 클래스와 자바 파일 이름을 동일해야함
- 패지키 이름 모두 소문자
- 변수. 메서드 소문자 시작 | 길어지는 경우 중간에 새 단어로 바뀔때 마다 대문자 → 가독성 UP > 카멜 표기법 (camel notation)
- 메서드
05.4 클래스와 인스턴스
- 클래스 사용과 main() 함수
- 프로그램을 시작하는 main 함수
- 자바 가상 머신 (JVM : Java Virtual Machine) 이 프로그램을 시작하기 위해 호출하는 함수
- Student 클래스에 main 함수 포함하기
public static void main(String[] args) { Student studentPark = new Student(); studentPark.setStudentName("박상준"); System.out.println("studentPark = " + studentPark.getStudentName()); System.out.println("========================"); }
인지
- 클래스 이름이 같아도 패키지가 다르면 다른 클래스
- aaa 패키지 ,bbb 패키지 존재 > 패키지 하위의 Student 클래스의 실제 이름 aaa.Student , bbb.Student
- 클래스 이름이 같아도 패키지가 다르면 다른 클래스
- 프로그램을 시작하는 main 함수
- new 예약어로 클래스 생성하기
- 클래스 생성
클래스형 변수 이름 = new 생성자;
- 클래스를 실제 사용할 수 있도록 메모리 공간( 힙 메모리 )을 할당 받는다는 의미
- 이렇게 실제로 사용할 수 있도록 생성된 클래스를
인스턴스
라고 함
참조변수
- 인스턴스를 가리키는 클래스형 변수 ⇒
studentPark
⇒ 이 변수가 생성된 인스턴스를 가리킴!!
- 인스턴스를 가리키는 클래스형 변수 ⇒
- 클래스 생성
- 인스턴스와 참조 변수
- 객체, 클래스, 인스턴스
객체
- 의사나 행위가 미치는 대상 (클래스의 타입으로 선언된 것)
클래스
- 객체를 코드로 구현한 것
인스턴스
- 클래스가 메모리 공간에 생성된 상태 (메모리에 할당되었을때 =인스턴스)
- 클래스의 생성자 호출 → 인스턴스 생성
- 인스턴스 여러개 생성하기
class StudentTest1 { public static void main(String[] args) { Student student1 = new Student(); student1.studentName = "박상준"; System.out.println(student1.getStudentName()); System.out.println("========================"); Student student2 = new Student(); student2.studentName = "김상준"; System.out.println(student2.getStudentName()); System.out.println("========================"); } } //생성자 2번 사용해서 서로 다른 변수 이름으로 클래스를 2개를 생성함 > 서로 다른 인스턴스가 2개 생성
- 참조 변수 사용하기
- student1.studentName →참조변수로 studentName 멤버 변수에 이름 저장
- 객체, 클래스, 인스턴스
- 인스턴스와 힙 메모리
힙 메모리
- 클래스의 멤버변수를 저장하는 메모리 공간
- 클래스 생성자는 하나 호출 시 힙 메모리에 생성됨
Student student1 = new Student(); //호출시 힙 메모리에 생성
- 스택메모리의 student1이 힙 메모리에 생긴 인스턴스 (Student 클래스) 를 가리킵니다
- 지역변수 student1에 생성된 인스턴스를 대입 == student1에 인스턴스가 생성된 힙 메모리의 주소를 대입
힙 메모리란?
- 힙
- 프로그램에서 사용하는 동적 메모리(dynamic memory) 공간
- 동적으로 할당되며 사용이 끝나면 자바에서는 자동으로 메모리 해체합니다
- 힙
- 참조 변수와 참조 값
- 참조변수
- 힙 메모리에 생성된 인스턴스
- 참조 값 출력하기
class StudentTest2 { public static void main(String[] args) { Student student1 = new Student(); student1.studentName = "박상준"; Student student2 = new Student(); student2.studentName = "김상준"; System.out.println("student1 = " + student1); //참조변수의 값이 출력됩니다! > 클래스이름@주소값(해시코드값) System.out.println("student2 = " + student2); System.out.println("========================"); } }
- 참조변수
05.5 생성자
- 생성자란
- 생성자
Person personLee = new (Person())<- 요 부분이 생성자입니다
- 클래스를 처음 만들때 멤버 변수나 상수을 초기화
- 디폴트 생성자
- 생성자가 없는 클래스는 클래스 파일을 컴파일할 때 자바 컴파일러에서 자동으로 생성자를 만듬
- 매개변수 X 구현 코드 X
public Person(){ }
- 생성자
- 생성자 만들기
- 역할
- 멤버 변수에 대한 값들을 매개변수로 받아서 인스턴스가 새로 생성될 때 멤버 변수 값들을 초기화하는 역할
public Person(int age, String name, boolean isMarried, int kidCount) { this.age = age; this.name = name; this.isMarried = isMarried; this.kidCount = kidCount; }
- 생성자!
psvm Person personLee = new Person(); //Person 객체에 오류가 발생합니다
- 오류난 이유!
- 생성자를 직접 구현하여 디폴트 생성자가 없음.
- 자바 컴파일러는 생성자가
하나도
없는 경우 디폴트 생성자를 제공
- 해결 방안
- 매개변수가 있는 생성자로 호출
- 프로그래머가 디폴트 생성자를 추가로 직접 구현
- 역할
- 생성자 오버로드
- 클래스에 생성자가 2개 이상 제공되는 경우
- Student 클래스
class Student { int studentId; public Student(int studentId) { this.studentId = studentId; } } //학번이 생성될 때는 반드시 학번이 존재해야한다면! //다음처럼 생성자 제공가능
- 디폴트 생성자 구현 X 이유
- 무조건 학번을 받아야하니까
- 생성자가 구현되어 있는 경우 디폴트 생성자를 컴파일러에서 생성해주지 않습니다
public Person() { ;; }// 디폴트 생성자 public Person(int age, String name) { this.age = age; this.name = name; } //매개변수 2
- 필요시 생성자를 선택해서 사용해도 됩니다 (생성자 매개변수 순서는 지켜야합니다)
- 디폴트 생성자 구현 X 이유
05.6 참조 자료형
- 참조 자료형
- 클래스 자료형으로 선언하는 변수?
class Student1 { int studentID; String studentName; int koreaScore; int mathScore; Subject koreaSubject; Subject mathSubject; }
- Subject라는 별도의 클래스 분리! 참조 자료형사용
- JDK 제공 || 프로그래머 필요에 의해 만듭니다
- 정보 은닉
- 접근 제어자 (access modifier)
- 예약어를 사용해 클래스 내부의 변수 || 메서드 || 생성자 에 대한 접근 권한을 설정
- 종류
- public
- 외부 클래스에서 접근이 가능하며 외부 클래스가 사용할 수 있다
- private
- 외부 클래스에서 접근불가능
- 아무것도 없는 경우
- default - 같은 패키지 내부에서만 접근간으
- protected
- 같은 패키지 내부와 상속 관계의 클래스에서만 접근가능, 그 외 클래스 접근불가능
<private test> class Student { int studentID; private String studentName; int grade; String address; public static void main(String[] args) { Student studentPark = new Student(); studentPark.setStudentName("박상준"); System.out.println("studentPark = " + studentPark.getStudentName()); System.out.println("========================"); } public String getStudentName() { return studentName; } public void setStudentName(String studentName) { this.studentName = studentName; } // } class StudentTest1 { public static void main(String[] args) { Student student1 = new Student(); //student1.studentName = "박상준"; //private으로 이름을 설정시 에러가 발생합니다 System.out.println(student1.getStudentName()); System.out.println("========================"); Student student2 = new Student(); //student2.studentName = "김상준"; System.out.println(student2.getStudentName()); System.out.println("========================"); } }
- private 으로 설정한 경우 외부 클래스에서 접근할 수 없기에 studentName이라는 멤버변수에 접근 불가능
- 해결방안
- public 으로 해당 변수에 대한 접근범위를 설정
- get() set() 메서드 활용
- public
- 정보 은닉이란??
class MyDate { public int day; public int month; public int year; }
class MyDate { public int day; public int month; public int year; } class MyDateTest { public static void main(String[] args) { MyDate date = new MyDate(); date.year = 2018; date.month = 2; date.day = 31; //해당 클래스의 멤버 변수에 직접적으로 접근이 가능해져버립니다!! > 2월은 31일이 존재할 수 없음! } }
class MyDate { private int day; private int month; private int year; public int getMonth() { return month; } public void setMonth(int month) { this.month = month; } public int getYear() { return year; } public void setYear(int year) { this.year = year; } public int getDay() { return day; } public void setDay(int day) { if (month == 2) { if (day < 1 || day > 28) { System.out.println("오류입니다"); } else { this.day = day; } } else { this.day = day; } } } class MyDateTest { public static void main(String[] args) { MyDate date = new MyDate(); date.setMonth(2); date.setDay(31); date.setYear(2019); System.out.println(date.getDay()); //해당 클래스의 멤버 변수에 직접적으로 접근이 가능해져버립니다!! > 2월은 31일이 존재할 수 없음! } }
- 접근 제어자 (access modifier)
Uploaded by Notion2Tistory v1.1.0