변수란?
무언가를 임시로 담아 두기 위한 용도
int형 a에 정수 10을 대입해준다.
상수는 10이고 값이 바뀌지 않지만
변수 a는 값이 변할 수 있다.
원시변수
인스턴트 변수, 지역 변수
int, bool, float,double
객체 레퍼런스 = 객체에 대한 참조
원시 변수의 규칙:
int count;
(type) 변수이름
이런식으로 일단 변수에 대한 정의를 해주고
그다음 다시 값을 대입해줄 수 있다.
변수의 원시(기본) 유형:
(boolean),문자형(char(2)),정수형숫자(byte(1),short(2),기본형 : int(4),long(8)),
부동소숫점 소수(flaot(4),기본형 : double(8))
ex)
int x =24; int형의 x에 24를 대입
byte b =x; byte형 b에 x를 넣으면 2바이트인 바이트형은 4바이트인 int형을 채울수 없으므로 에러
선언
정수형
int a = 123 , c = 455;
long b = 1124L; 여기서 long형은 대문자L을 뒤에 써줘야한다.
부동소수점 소수
double a= 1.234E8;
float b = 1.234F , c = 1.222f; float형도 뒤에 f를 붙어줘야한다.
부동소수점의 기본형은 double 형이다.
값을 변하지 않도록 하기 위해서는 앞에 final을 붙여준다
final int FEET_PER_YARD =3; 변수명은 대분자로 해주고 그 사이는 _바를 이용한다.
이런식으로 써주는게 규칙이다.
객체의 경우에는 상속을 못하게 막아주는 역할을 한다.
객체 레퍼런스
객체 변수라는 것은 없음.
객체 레퍼런스 변수라는 것만 있음
객체 레퍼런스에 객체가 들어가는 것이 아닌 객체를 가리키는 주소가 있음
.(dot)을 이용하여 속성이나 메소드에 접근할수 있다
ex) Books book = new Book();
1번 3번 2번
1번)레퍼런스 변수 선언 --->2번) 객체 생성 --->3번 =으로 객체와 레퍼런스연결
book.name = "asdf";
book.print();
이것이 Book()객체를 생성하여 book로 가리키게한다음 book이라는 레퍼런스 변수를 이용하여 Boo()객체속에 있는 변수에 값을 대입하는 것이다.
그림 16 참조
배열
원시 타입의 배열
int[] nums;
num =new int[3];
num[0] = 5;
num[1] = 4;
num[2] = 5;
배열은 0부터 시작 한다.
int형의 변수 3개를 생성
만약 배열의 경우
이렇게 했을때 선언과 동시에 배열에 값을 대입해야 한다.
int[] array = new int[4];
array = {30,40,50,40};
이럴 경우 에러가 생기고 이렇게 해서도 안된다.
이거 명심하다..나 틀렸었다.
객체 레퍼런스에 대한 배열
Dog[] pet = new Dog[3];
여기서 바로
pet[0].name = "아야어여";
pet[1].name = "가나다라";
pet[2].name = "가갸거겨";
이렇게 하면 에러가 뜬다. 왜냐 하면
처음에 레퍼런스 변수만 선언을 하였기 때문이다.
Dog객체는 따로 만들어 줘야 한다..이렇게..
pet[0] = new Dog();
pet[1] = new Dog();
이런식으로..객체를 만들어 주고
pet[0].name = "아야어여";
이렇게 접근을 해야 한다.
메소드에 뭔가를 보내기
메소드에서 사용하는 것은 매개변수, 호출하는 쪽에서 전달하는 것은 인자.
Dog d = new Dog(); //레퍼런스 변수d에 Dog()객체를 가리키게함
d.bark(3) //bark라는 메소드에 인자 3을 넘김
인자
----------------------------------
class Dog{
매개 변수
void bark(int numOfBarks) { //여기서는 인자 3을 받음
whlie (numOfBarks > 0 ) { //인자가 0보다 크면
System.out.println("ruff"); //ruff를 출력
numOfBarks = numOfBarks -1; //인자를 하나 빼서 다시 넣음
}
}
}
두개 있는 메소드를 호출하면서 인자 두개를 보낼 때..
void go() {
TestStuff t = new TestStuff();
int x= 7;
t.takeTwo(21,24); //여기서 인자 두개를 보냈음
}
void takeTow(int x, int y) { //매개변수가 2개 있으므로 인자 두개를 받음
int z = x+y; //x=21,y=24가 대입된후 더한 값을 int z에 넣음
System.out.println(z); //z를 출력하면 45가 출력된다.
}
------------------------------------------------------
메소드에서 어떤 값을 돌려 주는 것
void go(){
}
리턴 형을 void로 선언했고 이 메소드는 아무것도 리턴 하지 않았다.
말그대로 void는 리턴이 없는 것이다.
공식
리턴형 메소드이름 (매개 변수){}
int giveSecret(){
return 42;
}
리턴 형은 int형이고 정수인 42를 리턴해주었다.
만약에 42.3이라는 실수 형은 리턴 할 수 없다.
이렇게 할려면 리턴 형을 float이나 double 으로 해주어야 한다.
왜냐..int형은 정수형이기 때문에..
실수형은 float이나 double형이다.
ex)
double giveSecret(){
return 42.3;
자바에서 값으로 전달합니다. 즉, 복사본을 전달하는 것
Cal a = new Cal();
int x = 30; //int형인 x에 상수 30을 대입
a.switch(x); //인자 값으로 x를 보낸다..말그대로 30을 보낸다.
void switch(int z){ 인자인 30을 받고
z=0; 그것을 0으로 만들어주었다.
}
여기서 보면 인자로 x로 보내주었다고 해서 값 그대로 보내준 것이 아니라
x의 복사본을 보내준 것이다. 그래서 인자 x를 받아서 0으로 만들어주었어도
저 위에 있는 int x= 30;이 변하는 것은 아니다..
음..
머 예를 들어 체크카드를 만들려고 한다. 이때 주민등록증이 필요하다. 은행에서 그 주민등록증을 가져다가 쓰는게 아니라..복사를 한다음 업무를 처리한다.
그 복사본을 찢던 꾸기던 멀 하던간에 내 진짜 주민등록증이 꾸겨지고 찢어지는 것이 아니라는 것이다.
그냥 복사한 걸 넘겨주었기 때문에..내껀 아무 이상 없다고 생각 하면 되지 않을까.?
----