6장. 객체지향 프로그래밍 1차
*클래스 생성 단계
1. 객체 정적/동적 특성 ; 코딩 단계가 아니다.
2. 클래스 정의 ; 코딩 단계
3. 객체(들) 생성 ; 코딩 단계
4. 객체 활용
TIP : Argument 활용 방법
class A{
public static void main(String[] args){
}
} ==> 체크 자동 선언 생성
JAVAC -- A.java(==> A.class 파일 자동생성)
java A ==> MAIN 찾아서 자동
java A 자바 프로그램 ==> A 클래스 실행 시점에서 2개 변수 입력
JAM 자동 실행 문장
args = new Stirng[2];
args[0] = "자바"
args[1] = "프로그램"
* 객체 생성
= 클래스 변수와 메소드 복사하여 메모리 저장
교육생 홍길동 = new 교육생();
객체 : 현실세계 명사(유형+무형) 모든 것 ==> 자바 S/W 단위 표현
객체 = object = instance
1. 객체 동적/정적 특성 파악
2. 클래스 정의 ; 정적/동적 동일 무수히 많은 객체 틀 (설계도, 원본)
클래스 ======= 인스턴스화 ======> 인스턴스(객체)
* 객체의 구성요소
속성(property) ; 멤버 변수, 특성, 필드, 상태
기능(function) ; 메소드, 행위, 함수
클래스 교육생{
메소드{
수강하다{..}
휴식하다{..}
점심먹다{..}
}
}
* 클래스 구성
[선언부]
[modifier] class 이름 [extends..][implements]
{
[멤버부]
멤버변수
메소드
생성자
}
* 클래스 구성요소
1. modifier 정의 ; 한정자, 수정자, 제한자 클래스나 변수, 메솓, 생성자 앞에 붙을 수 있으며 활용방법이나 접근(사용)권한 지정 역할 몇개의 키워드들
|
Modifier |
클래스 |
변수 |
메소드 |
생성자 |
접근 권한 |
public |
o |
o |
o |
o |
protected |
x |
o |
o |
o | |
private |
x |
o |
o |
o | |
활용 방법 |
static |
x |
o |
o |
x |
final |
o |
o |
o |
x | |
abstract |
o |
x |
o |
x | |
기타 |
|
|
transient volatile |
native synchronized |
|
* 클래스 메모리 현 상태
TV mytv = new TV();
1. myTV 변수를 STACK 저장
2. NEW 연산; heap
3. 2번 결과(주소) 1번 대입
stack heap; 100번지
mytv;100번지 power
volume
channel
setPower()
volumeUp()....
mytv > setPower()
객체 지향적 : 현실 객체(무수히 많은) 표현틀 정의
배열; 동일 타입의 여러가지 데이터 저장 묶음
구조체; 서로 다른 타입의 데이터 묶음
structure 회사원
int 사원
String 이름
double 급여
}
class ; 자바 서로 다른 타입의 데이터+기능 묶음
class 회사원{
int 사원
String 이름
double 급여
void 총급여계산(){}
}
회사원 변수타입; 자바 기본 제공 --> 없으면 사용자 정의한다.
* 클래스 관점
1. 현실객체
2. 데이터+기능
3. 사용자 정의
* 객체 생성
class A{
int i = 10; ==> 메소드 외부; 멤버변수, 전체클래스 / 자동 초기화 (int ; 0)
= 객체 정적 특성 변수
void add(int k){==> 매개변수
int j = 20; ==> add 메소드의 지역변수, 메소드 내부 / 프로그래머 초기화
i+j;
}
void sub(){
i-j;
}
}
* 멤버, 지역 변수
멤버변수 |
class 변수 |
|
|
| |
지역변수 |
메소드 내부 선언 |
|
메소드 매개변수 |
|
class 회사원{
static String 회사명 = "삼성";
.....
}
class 학생{
static String 학교명 = "한국대학교";
.....
}
* 메소드 규칙
class ...{
[modifier] 리턴타입 메소드명([매개변수]){
메소드 기능 구현 문장;
}
1. 동사/소문자 시작/두번째단
2. 숫자 시작 x, 예약어 x
3. 대소문자 구분
4. 자바 모든 데이터 타입
int, double, boolean, char + 배열 + String + ...
* 리턴(return)타입
int test(){
int j=10;
return j*j;
}
class ATest{
public.. main(){
A al = new A();
int r1 = al.test();
* 매개변수
class ...{
[modifier] 리턴타입 메소드명(int j){
지역변수 선언
int i = 10; // 프로그래머 선언+값 초기화
메소드 기능 구현 ㅁ누장;
}
}main 메소드 내부
메소드 명(10);
* 멤버부
멤버변수 ; 클래스전체, 객체 정적특성
- Non-static 멤버변수 : 각 객체마다 서로 다른 값 저장 변수
- static 멤버변수 ; 모든 객체 공통 1개 값 저장 변수(공유)
class 회사원{
회사명 = "";
}
class 학생{
학번
학교명
}
다른언어 ; 함수나 프로시저
* 매개변수
; 메소드 외부 전달 필요 변수
매개변수 전달원리?
1. 메소드
call by value ; 메소드 호출시 값 복사 전달
기본형 변수 매개변수 --> stack 실제값 저장
; 메소드 호출시 실제값 복사 전달
이후에 메소드 내부에서 값이 i값이 변경되면 j값이 변경 없다.
addInt(int i){..}
==> 메소드 정의시점에서 형식, 순서, 갯수 정의 형식매개변수 정의
t.addInt(j);
==> 메소드 호출시점에서 j 실매개변수 전달
참조형 변수 매개변수 --> stack 주소값 저장
; 메소드 호출시 주소값 복사 전달
class A{
int x = 10;
}
void addA(A a1){
System.out.println(a1.x++);
}
A a2 = new A();
t.addA(a2);
System.out.println(a2.x);
실매개변수(a2)를 형식매개변수(a1)로 주소값 복사 전달; a1,a2 동일 주소 객체 참조
형식매개변수 내부 포함 변수값(a1.x:10-->11) 변경하면 실매개변수 내부포함 변수값(a2.x:11) 변경된다.
* String
; 문자열 데이터에 자주 사용 되는 참조형 변수
String s1 = "abc";
String s2 = new String("abc");
String class ; api 제공, 문자열 제공 기본형 변수 타입 없다.
; new 키워드가 없어도 가능
s1.equals("+")
* 생성자 특징과 정의
1. 생성자 호출 위치 ; new 키워드 뒤 사용
2. 정의 내용 ; 객체생성시점 수행 문장 정의(보통 객체 변수값 초기화 문장)
3. 클래스 내부 "자동"으로 기본 생성자 정의
클래스이름(){ super(); }
4. 생성자 형태
[modifier] 클래스이름([매개변수]){
객체 생성 시점 수행 문장
}
5. 클래스 이름과 같다.
6. 리턴타입 없다.
7. 사용자 생성자 정의 가능, 기본생성자에 없는 매개변수 필요하거나 super() 문장 이외의 다른 문장 수행 필요
8. 기본 생성자 존재하는데도 사용자 생성자 정의 = 기본 생성자 필요없다.
그래서, 사용자 생성자 정의하면 기본 생성자 "자동" 삭제
9. this 키워드 ; 현재 자신 객체 의미 키워드
10. 멤버변수와 매개변수 이름이 같은 경우 구분
this.멤버변수
Employee e = new Employee(....);
1. e변수 Stack 저장
2. new Employee 변수와 메소드 복사 heap 저장
3. 생성자
4. 결과가 1번에 대입(주소)
* 생성자 오버로딩 가능
같은 클래스에 같은 이름의 생성자 여러개정의 매개변수 갯수나 타입이나 순서 중 하나 이상 다르게 정의