후...일단....
자바의 정석 6강을 두번 들었는데
두번 듣는 동안 이전 강의들 다 까먹을 것 같다..ㅜ
머리가 터지겄어요...뇌의 이해도가 날로 느려지는 것 같다
일단 6강 두번 들은 동안 요약본을 정리해보겠다..
어려우면 이해하려고하지말고 개념과 규칙을 외워야한다!!!!!

자바의정석 6강
- 객체지향 언어
2-4 클래스와 객체
6 5 한파일 여러 클래스 작성하기
6-7객체의 생성과 사용
8 객체배열
9-10 클래스의 정의
11 선언위치 변수 종류
12-13 클래스 변수, 인스턴스 변수
14-16 메서드란? 메서드의 선언부와 구현부
17-18 메서드 호출
20-21 return문, 반환값
22 호출스택
23 기본형매개변수
24-25 참조형매개변수, 참조형 반환타입
26-29 static 메서드와 인스턴스 메서드
30-31 오버로딩
32-35 생성자, 기본생성자
36-37 생성자 this(), 참조변수 this
38-41 변수의 초기화, 멤버변수의 초기화
객체지향언어란?
기존 프로그래밍 언어에 몇가지 규칙을 추가한 것일 뿐
코드의 재사용성과 관리가 쉬워 다루기 좋다
클래스와 객체
클래스- 객체를 정의해 놓은것 , 객체를 생성하는데 사용됨
객체 - 실제 존재하는 것,
객체와 인스턴스
객체와 인스턴스는 거진 같은 단어라고 할 수 있음
객체 - 모든 인스턴스를 대표하는 포괄적인 단어
인스턴스- 어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스라고함,
객체에는 속성(변수)과 기능(메서드)가 있다.
속성과 기능의 집합이라고 할 수 있음. 얘네가 멤버임
얘네들은 클래스에 정의된 속성과 기능을 가짐
클래스로부터 인스턴스를 생성하는것을 인스턴스화 한다고함
인스턴스(객체) 생성 방법
변수선언 ->객체 생성 순인데
합쳐서도 쓸 수 있음
- 변수선언
클래스명 참조변수명;
Tv t;
TV클래스 타입의 참조변수t 선언
-> 객체를 다루기 위한 변수 선언, 풀어서 클래스의 객체를 참조하기 위한 참조변수를 선언 한것임
아직 참조변수 t를 위한 공간이 만들어졌을 뿐 객체 생성이 되지 않았음
2. 객체 생성
참조변수명 = new 클래스명();
t = new TV();
-> TV인스턴스를 생성한 후, 생성된 Tv인스턴스의 주소를 참조변수 t에 저장
클래스명(TV();) 을 참조해 객체생성(new) 하고 객체의 주소를 t에 저장,연결(=)하는거임
합쳐서
Tv t = new TV();
클래스명 변수명 = new 클래스명(값,,,);
참조변수는 앞에 클래스명이 붙음(Tv t;)
일반변수는 앞에 타입이 붙음 (int t;)
변수 중에 타입 부분인 앞의 부분이 기본형 타입이 아니라면 다 참조변수인것임
객체(인스턴스)의 생성과 사용
변수의 사용
참조변수명.변수=값,데이터 ;
t.channel = 7;
-> 참조변수 t가 가르키는 인스턴스의변수(객체의변수) channel 에 7을 저장해라
메서드호출 방법 (메서드사용)
t.channelDown();
-> Tv인스턴스의 메서드 channelDown()을 호출한다. 참조변수 t가 가르키는 객체의 channelDown()메서드를 호출한다.
-> tv 클래스에 정의된 메서드 channeldown()으로 이동해 메서드(그안에코드,문장)을 실행하고 그 값을 t에 저장한다
Tv t; ->변수선언 (클래스명 변수명;)
t = new Tv(); -> 객체생성 / (Tv()클래스를 참조해 t라는 객체(공간?)을 new새로만듬)
t.channel = 7; -> 객체의변수사용 // t가 가르키는 객체의변수 channel에 7을 저장
t.channelDown(); -> 메서드호출 // channelDown()이라는 메서드를 호출한다
*주의
여러개의 참조변수가 하나의 인스턴스가르키는것은가능
한개의 참조변수가 여러 인슨턴스 가르키는것은 불가능
객체배열
일반배열이랑 비슷함
객체배열 = 참조변수배열 이라는 의미임
객체배열 생성 방법
Tv[] tvArr = new Tv[3]
->tv타입의 참조변수 tvArr 객체배열 3개가 생성됨
값을 아래처럼 넣어줘야하는데
tv Arr[0] = new TV();
tv Arr[1] = new TV();
tv Arr[2] = new TV();
블럭을 사용해 합쳐서 쓰기 가능
Tv[] tvArr = {new Tv(), new Tv(), new Tv()};
->순서대로 저장됨
변수와 메서드
변수의 종류에는
인스턴스 변수 (iv) / 클래스변수 (cv) / 지역변수 (lv) 가 있음
이것들은 어느 영역에 선언되는지에 따라 종류가 결정됨
선언위치는 클래스영역/ 메서드 영역을 나뉘는데
클래스 영역에 선언된 변수를 멤버변수라고 말하는데
그게 클래스변수(cv)와 인스턴스변수(iv)임
iv앞에 static 붙이면 cv가 되는것임
클래스영역이 아닌 메서드 변수에 선언된 변수는 지역변수 lv 임
영역이 2개기 때문에 메서드영역 아니면 클래스영역인것임
클래스영역은 선언문만가능
변수선언, 메서드선언만 가능
인스턴스 변수
- 긍까 클래스 영역 전체에서 사용가능한데 static이 안붙어있음 iv인 것임
iv는 인스턴스(객체)가 생성(만들어졌을때)되었을 때 만들어짐
클래스 영역 어디에서나 인스턴스 변수 선언은 가능하지만 객체가 생성되었을때 iv가 생성되는거임
객체를 생성하면 클래스 내용을 보고 클래스에 정의된 대로 만들어지는거임
즉 객체는 iv변수를 묶어논것이다
객체생성을 해야 iv를 쓸 수 있는거임
객체를 만들면 iv가 만들어지는거임
값이 달라도 되는 개별 속성은 인스턴스변수를 씀
객체마다 서로 다른 값을 써야하면 인스턴스변수로 선언
클래스변수(cv) -static 붙은 변수
iv와 같이 클래스 영역에서 사용되는데
iv앞에 static 붙이면 cv가 되는것임
메모리가 올라갈때 만들어짐
인스턴스변수와 달리 객체생성을 안해도 그냥 메모리에 올라가면 자동생성되는것임
즉 객체생성 필요없음, 아무때나 사용가능
모든 인스턴스들이 공통적인 값을 가져야하는경우 static을 붙여 클래스변수로 선언
즉 클래스 변수는 모든 인스턴스가 하나의 저장공간을 공유하므로 항상 공통된 값을 가진다(하나바뀌면 다 바뀜)
클래스변수를 사용할때는 a.width로 쓰지말고 ' 클래스명.클래스변수 ' 로 써 인스턴스변수와 구분이 가능하도록 하자
cv변수를 사용할때는 cv변수앞에 클래스 이름을 붙이자
(예제 6-5를 표로 만들어봄)
만약 카드 클래스를 만든다면
그 안에 카드들을 각각 설정해줘야함
객체들을 생성 -> 값 설정(변수설정)
변수선언\ 객체생성(인스턴스)
|
a객체(인스턴스a)
Card a = new Card(); |
b객체(인스턴스b)
Card b= new card(); |
c객체(인스턴스c)
Card c = new card(); |
무늬 변수 (iv) String kind;
(변수사용 / 값대입 )-> |
하트
(a.kind = "Heart") |
클로바
(b.kind = "Clova") |
다이아
(c.kind = "Dia") |
숫자 변수 (iv) int number;
(변수사용/ 값대입 )-> |
4
(a.number = 4;) |
7
(b.number = 7;) |
10
(c.number = 10;) |
길이 변수 (cv)
static int width = 100; |
- (static으로 선언한값100)
|
||
높이 변수 (cv)
static int height = 250; |
- (static으로 선언한값=200)
|
걍 대략적으로 이런느낌인가.....그냥..이해를 높이기위한 표....참고만...참고만...하기
긍까 static 변수와 iv변수의 객체 공간 사용을 표로 나타낸거임..이걸 코딩으로 짜야함
무늬변수, 숫자변수는 각 객체마다 값이 달라야하니 iv변수인거고
길이변수, 높이변수는 각 객체마다 값이 같아야하니 static을 붙여 공통값을 주는거임
만약 a의 인스턴스의 클래스변수(cv)를 변경하면 다른 인스턴스의 값들도 바뀜
하나의 클래스에
변수 선언을 하고
또다른 클래스에
객체생성하고 값 대입함
먼저만든 클래스의 변수들을 사용하는(대입)하는거임
변수 선언해놓으면 객체 생성하고, 객체 안에 값들을 넣어주는겅미
지역변수(lv)
메서드 변수
메서드 내에서만 쓸 수 있음
메서드 종료시 자동 소멸
메서드 안에 변수 쓰면 그것은 지역변수lv인것임
메서드
메서드란
1.함수와 비슷한데, 일련의 작업들을 수행하기 위한 명령문,을 묶어서 이름을 부인것
2. 메서드 정의와 메서드 호출로 중복된 코드 작성을 방지하고, 반복을 줄여주며 코드관리유지보수가 용이
3. 어떤 값을 입력받아서 작업을 수행하여 결과를 반환할수 있다.(입출력값없는것도 ㄱㅊ)
4. 반복적으로 수행되는 여러문장들을 메서드로 만들면 좋음
5. 하나의 메서드는 한가지 기능만 수행되는게 좋음 (수정에 용이하게)
메서드 정의는 선언부/구현부로 나뉘어지며
구현부는 중괄호 부분으로 메서드가 작업을 수행하는 코드가 있는구간. 그 전이 선언부
클래스 영역 내에서만 정의가능하다.
메서드 내의 선언된 변수는 모두 지역변수 lv이다
메서드정의 (메서드 만드는 방법)
결과값반환타입 메서드이름 ( 입력받을값의 타입 변수명, 입력받을값의 타입 변수명,....) { 메서드 호출 시 수행될 코드 }
ex)
int add (int a, int b, int c) {
int result = a +b; -> 수행될 작업
return result; -> 호출한 메서드로 결과를 반환
}
결과값반환타입 메서드이름 ( 입력받을값의 타입 변수명, 입력받을값의 타입 변수명,....) { 메서드 호출 시 수행될 코드 }
매개변수
저 입력 받을 값 타입 변수 명을 매개변수라고 한다.
즉 괄호 안에는 매개변수 타입을 입력하고 매개변수명을 입력한다는 뜻.
쉼표로 구분. 입력받을 값이 없으면 아무것도 적지않고 ()만 한다.
메서드 이름
변수의 명명규칙대로 작성하면된다.
메서드는 특정작업을 수행하는것이므로 이름은 add 처럼 동사인 경우가 많다.
이름만으로 메서드의 기능을 알 수잇또록 잘 짓도록 노력해야함
반환타입
메서드의 작업 수행 결과인 반환값의 타입을 적는다. 반환값이 없는경우 void를 적어야한다.
입력값은 0~n개 가능하지만 출력값은 0~1개만 가능하다. 2개 이상은 배열을 이용하거나 객체를 묶어야한다
메서드구현부
안에 들어가는 변수들은 지역변수
매개변수의 값을 받아 작업을 수행함
메소드 영역이 서로 다르다면 변수이름은 겹쳐도 상관이없다
왜냐 지역변수는 메소드가 소멸하면 같이 소멸하니까...다른 공간 느낌
특이점...세미클론없음?
메서드 호출
특정위치에 저장되어있는 명령들을 수행함
메서드를 위에서 만들었다(정의)했다고 해도 호출을 하지않으면 실행이 되지않음
호출을 해야 메소드 안에 쓴 문장의 것들이 수행이 된다
(중복되는 작업이 있으면 메서드로 정의(만들어놨다가)해놓고 메서드안의 작업들이 필요할때마다 메서드 이름을 써서 호출하는거임, 누구야~ 이름 불르고 일시키고 결과값 반환하고 가는거임)
메서드 호출 방법
메서드이름(값, 값2,값3,....);
출처 입력
메서드이름(값1,값2,값....);
참조변수.메서드이름(값1,값2,...);
값은 없을수도 있고 있을수도 있음, 값은 메서드가 작업하는데 필요한 값들을 적어줌
같은 클래스 내에 메서드들 끼리는 참조변수 없이 호출가능.
ex) int result = add (3,5);
해석-> add메서드를 호출하는거임. 입력값은 3과5.
클래스 영역내에서 add 이름의 메서드를 찾아가 3과5를 가지고 그 안에 구현부 문장을 수행함. 그리고 결과값을 받음. 돌아와서 그 결과값을 result에 저장하는거임. int 는 그 결과값(반환값)이 int타입이라는거
참조변수는 ->참조형 매개변수, 참조형 반환타입을 장으로 가야함
return 문
메서드 정의, 메서드 문에서 쓰는건데
현재 실행 중인 메서드를 종료하고 호출한 곳으로 되돌아가는거임
메서드 마지막에, 작업을 마쳤을때 return; 하고 써야함
메서드가 void타입(반환값이없음)이면 ruturn문을 생략해도되지만
아니라면 반드시 return문이 필요함
호출스택(call stack)
메서드가 수행에 필요한 메모리가 제공되는 공간
메서드가 호출되는 순간 호출스택의 메모리를 쓰고, 종료되면 없어짐(해제)
ㅂ 모양의 실행중인 메서드가 쌓이고 실행중이아니면 없어짐
스택에 여러가지 메서드가 있을 땐 맨위의 메서드 하나만 실행중이며 나머지는 대기중인상태임
하나의 스택에서는 하나의 메서드만 실행중이라는걸 기억
기본형 매개변수 & 참조형 매개변수
(어려워서 3회는 본 영상)
호출스택과 객체(인스턴스)를 잘 이해해야 이해가감
변수 타입에는 기본형매개변수/참조형매개변수가 있음
매서드 호출 시 매개변수로 지정한 값(호출할때 입력한값,메서드 정의시 지정한타입)을 메서드의 매개변수에 복사해서 넘겨줌.
이 매개변수 타입이 기본형이면 단순저장값(기본형값)이 복사되서 넘어가지만
참조형인경우 만들어놓은 인스턴스(객체) 주소가 복사됨
값이 저장된 곳의 주소를 얻는것이기 때문에 read & wirte가 가능한것
기본형 매개변수 - 변수의 값을 읽고 쓰기만 가능 (값변경불가)
기본형 매개변수의 메서드 호출 모양-> 메서드이름(int x);
참조형 매개변수 - 변수의 값을 읽고, 변경 가능함
참조형 매게변수 메서도 호출 모양 ->메서드이름(클래스이름 x);
포인트는 매개변수값이 참조형(기본형타입이 아닌 그 외의 이름,클래스이름) 인지/ 기본형타입(int, long, Stirng,,등 7개였나)인지 구분하기
예제의 문제를 코드만보고 실행순서 및 스택사용기를 그림으로 그릴수잇어야함
참조형반환타입
위랑 비슷하게 그 전꺼를 이해해야 이해가감
예제 참고
매개변수말고 반환타입도 참조형이 될 수 있음
반환타입이 참조형인경우 -> 객체의 주소를 반환한다는 의미
반환한 값이 객체의 주소라는 것임
return tmp; ->tmp 객체의 주소를 반환한다
static 메서드 & 인스턴스 메서드
static 메서드 (=클래스변수)
메서드 앞에 static 붙은거
객체생성없이 '클래스이름. 메서드이름();'으로 호출
인스턴스멤버 변수 (iv,im)와 관련,관계없음,사용못함
static은 iv의 존재 여부에 따라 붙일지 말지를 결정한다
static 메서드 호출 방법 : '클래스이름. 메서드이름();'
static은 iv의 존재 여부에 따라 붙일지 말지를 결정한다
static은 iv의 존재 여부에 따라 붙일지 말지를 결정한다
static은 iv의 존재 여부에 따라 붙일지 말지를 결정한다
ex) 메쓰(수학)메서드
-> Math.round();
Math.random();
->객체 생성 필요 없었음, 어디서나
1. 인스턴스 변수 사용이 불가능
2. 클래스 변수 사용가능
3. 메서드 내의 지역변수 사용 가능
인스턴스메서드 (객체생성해야함)
static안붙은 메서드
인스턴스(객체)를 생성해야지 호출가능
ㅇ인스턴스생성 후, '참조변수.메서드이름();'으로 호출
ㅇ인스턴스멤버와 관련된 작업을 하는 메서드
1. 인스턴스 변수 사용가능
2. 클래스 변수 사용가능
3. 메서드 내의 지역변수 사용 가능
인스턴스메서드 호출방법 : '참조변수.메서드이름();'
*멤버변수
-클래스 영역에 선언된 변수들을 총칭(클래스변수,인스턴스변수포함)
메서드간의 호출과 참조
-static 메서드는 인스턴스 변수(인스턴스메서드도)를 사용할수없다
오버로딩
한클래스 안에 같은 이름의 메서드 여러개를 정의하는것
ex) println(...);
조건 (3개다 일치해야함)
1.매서드이름이 같다
2.매겨변수의 개수나 타입이 달라야함
3. 반환타입은 영향을 주지않음 (노상관)
같은 일을 하는 메서드들인데 다른이름을 가지는건 비효율적이기때문임
생성자
-인스턴스(객체)값 초기화 메서드
인스턴스 변수의 초기화 작업에 사용
생성자도 메서드처럼 클래스 안에 선언되며, 메서드와 유사하지만 리턴값이 없는게 차이임.
생성자 정의방법
클래스이름(타입변수명, 타입변수명,...) { 인스턴스 생성시 수행될 코드, 주로 인스턴스 변수의 초기화 코드를 적음 }
생성자의 이름은 클래스 이름과 같아야함
생성자는 클래스 이름을쓰고 메서드는 메서드이름을 씀
ex)
class Card {
card() { ...} -> 매개 변수없는생성자
card(String k, int num) {.....} -> 매개변수 있는 생성자
인스턴스생성할때 Tv t = new TV(); 에서 TV() 가 생성자였던거임
흐름 ->1. 연산자 new에 의해 메모리에 Tv클래스의 인스턴스가 생성됨 2. 생성자 TV()가 호출되어 수행됨 3. Tv인스턴스의 주소가 반환되어 참조변수 t에 저장된다
모든 클래스에는 하나 이상의 생성자를 가져야함
하지만 클래스에 생성자가 한개도 없으면 자동으로 기본생성자를 추가함.
기본 생성자는 '클래스 내에 생성자가 하나도 없을때' 뿐임
기본 생성자
클래스이름() { }
매개변수가 있는 생성자
클래스이름(매개변수) {}
인스턴스 생성하고 인스턴스마다 각기 다른 값으로 초기화(값을넣어줘야할때) 되어야할때 매개변수를 사용한 생성자 초기화는 매우 유용
객체(인스턴스) 생성 할 때 변수에 값을 한하나 넣기 불편하니까 한번에 할 수 있도록 하는거
Time t = new time();
t. hour=12;
t.minute=34;
t.second=56;
이렇게 객체생성하고 따로 값 하나하나 넣기 불편해서
Time t = new time(12,34,56);
괄호안에 초기화할 값을 넣는거임
이것이 생성자가 필요한 이유임..여러줄 써야할걸 한줄만 쓰면됨
물론 다른 위치에 메서드로 변수를 선언해놓았겟쥬...?
생성자의 조건
- 생성자의 이름은 클래스와 같아야함
- 생성자는 리턴값이 없음
생성자도 오버로딩 가능
생성자 this()
같은 클래스에 있는 다른 생성자를 호출할때, 클래스 이름 대신 this()를 쓴다
한 생성자에서 다른 생성자를 호출할때는 반드시 첫줄에서만 호출가능
생성자가 왜 다른 생성자를 부르겠음? 생성자가 하는일이 초기화니까...값넣으려고
왜 this를 쓰냐고? 그냥 규칙임. 외우셈
코드의 재사용성을 편리하게 함.
p296
참조변수 this
지역변수 lv와 인스턴스 변수iv를 구별할때 사용
this 붙으면 iv 아니면 lv
인스턴스의 주소가 저장되어있다
생성자this()와는 관련없음. 완전다름
인스턴스 자신을 가리키는 참조변수인거임
인스턴스 메서드에서만 사용가능(생성자포함)
this -> 참조변수임.인스턴스 자신을 가르키는 참조변수. 모든 인스턴스 메서드에 지역변수로 숨겨진채로 존재한다
this() ->, this(매개변수 -> 생성자임. 같은 클래스의 다른 생성자를 호출할때 사용
변수의 초기화
지역변수(lv)는 사용전에 꼭 수동으로 초기화해야함
멤버변수 iv,cv 0으로 자동 초기화됨
지역변수 초기화 안하면 변수선언하고 변수사용할때 에러남,안에 값이 없는상태기까
멤버 변수 초기화
지역변수와 달리 여러가지 방법이 있음
- 명시적초기화 - 대입연산자
- 생성자
- 초기화블럭 - 클래스초기화블럭
1.명시적초기화
대입연산자로 초기화하는거, 특정값 넣을때 좋음
기본형 변수의 초기화
int door = 4;
참조형 변수의 초기화
Engine e = new Ecgine();
참조형 변수의 값은 null 아니면 객체주소가 들어가게됨
참조형 변수는 객체를 만들어주고 초기화 해줘야함
2. 초기화 블럭
복잡한 초기화 할때 씀
인스턴스초기화블럭 : {} -> 근데 잘 안씀 pass
클래스 초기화 블럭 : static {} (cv변수 초기화)
3. 생성자 ← iv초기화, iv 복잡한 초기화에 사용
cv, iv 초기화의 방법들
- 자동초기화 -> 기본값으로 자동으로 초기화되는것
- 간단초기화 -> 대입 연산자로 하는 초기화 (=명시적초기화)
- 복잡초기화
- {} <-iv 블럭, 거의안씀
- static{} <- cv변수
- 생성자 <-iv 변수
멤버 변수의 초기화 시기와 순서
클래스변수 : 클래스가 처음 로딩(메모리에올라갈때) 단 한번만 초기화됨
인스턴스 변수의 초기화 시점 : 인스턴스(객체)가 생성될 때마다
초기화 순서 (cv에서 iv 순으로, 자동에서 복잡 순으로 )
cv 기본값(자동초기화) -> cv명시적초기화 -> 클래스초기화블럭 -> iv 기본값 -> iv명시적초기화 -> iv 초기확 블럭 -> iv 생성자
***클래스 변수는 항상 인스턴스변수보다 항상 먼저 생성되고 초기화된다 ***
아니 요약인데 왜 이렇게 길어~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!!!!!!!!!!
더줄여
외울거만 요약해
a4 한장으로 요약해...ㅡㅡ
'꽉java' 카테고리의 다른 글
사용자 비밀번호 관리 필드 속성 (0) | 2023.08.11 |
---|---|
[JDBC] Java Properties 활용 SQL 쿼리문을 위한 XML 파일 작성 (0) | 2023.01.01 |