문자 배열인 char 배열과 같은 뜻으로 String 클래스를 이용해서 문자열을 처리하는 이유
String클래스가 char 배열에 기능(메서드)을 추가한 것이라서 그럼..
String str = "JAVA"; 이 사이즈만 자리가 잡힘
str = str + 8; //"JAVA8"이라는 새로운 문자열이 str에 저장이 된다.
출력 : " Java8 "
집을 하나 배정 받아놓고 집청소만 함
int 뿐만 아니라 다른 타입의 배열도 있돠
String[] name = { "kim", "park", "lee" };
int i;
for(i=0; i<name.length; i++)
{
System.out.println("name[" + i + "] : " + name[i]);
}
String tmp = name[2];
System.out.println("tmp : " + tmp);
name[0] = "yu";
for(i=0; i<name.length; i++)
{
System.out.println(name[i]);
}
String 타입의 배열을 생성 후 kim, park, lee를 차례대로 넣어주고,
이름을 순차적으로 출력해준다.
임시 변수 tmp를 만들고 lee를 넣는다.
tmp : lee 출력
name 배열의 첫번째 칸에는 yu를 넣는다.
포문을 돌려서 출력을 하면?
yee, park, lee 출력이 됨
name[0] : kim name[1] : park name[2] : lee tmp : lee yu park lee |
다차원배열
이것만 이해해도 끝 [ i = 행 / j = 열 ]
//다차원 배열
int[][] score = {
{100, 100, 100},
{20, 20, 20},
{30, 30, 30},
{40, 40, 40},
{50, 50, 50}
};
int korT=0, engT = 0, mathT = 0;
int i, j, sum;
double avg;
System.err.println("번호 국어 영어 수학 총점 평균\r\n"
+"===============================");
//i는 학생번호
for(i=0; i<score.length; i++)
{
sum = 0;
korT += score[i][0];
engT += score[i][1];
mathT += score[i][2];
System.out.printf("%3d", i+1);
for(j=0; j<score[i].length; j++)
{
sum += score[i][j];
System.out.printf("%5d", score[i][j]);
}
avg = (double)sum / score[i].length;
System.out.printf("%5d %5.1f\n", sum, avg);
}
System.out.println("===============================");
System.out.printf("총점 : %3d %4d %4d \n", korT, engT, mathT);
// %3d 오른쪽 정렬
//왜 총점을 포문 부분 밖에서 찍는지!!
오버로드
하나의 클래스 안에 들어있지만 데이터 타입이나 길이가 다름
캡슐화(private) - protecated, public 타입에서는 값을 변경할 수 있는데 캡슐화는 다른 곳에서 상속을 받더라도 수정이 안 된다. 멤버.java에서만 수정을 할 수 있음. 그만큼 신뢰성이 높다는 게 장점으로 자주 쓰인다.
- static 키워드가 없는 일반 public이라면 객체생성을 해줘야한다. member.java 클래스 안에는 속성(변수 개념)과 기능(메소드 개념)이 있음. new member();으로 객체 생성을 하는 순간 이 영역들이 메모리에 본인 크기 만큼 할당된다. 객체 생성시에 할당 받았던 배열의 시작주소를 가리킨다는 말이다. 이걸 빼와서 사용할 수 있음!!
클래스 = 객체 = 인스턴스(붕어빵 틀)
크게 보면 같지만 세세하게 나누어 보면 차이가 있다. 클래스의 경우 속성들과 기능들을 사용할 수 있도록 만든 설계도 라고 할 수 있는데 여기서 객체는 설계도로 구현한 모든 대상이다. 클래스의 타입으로 선언 됐을 때 객체라 명하고 그 객체가 메모리 상에서 할당이 되어 실제로 사용을 할 때는 인스턴스 라고 한다.
붕어빵 틀로 예를 들수도 있다. 틀만 있을 경우 반죽과 팥을 넣고 만들어야 비로소 붕어빵이 되는 것처럼 클래스는 만들기 위한 구조만 있고 안에 데이터는 없는 상태이다. 또한 클래스에는 사용하는 공식들이 정해져 있는데 예제들을 통해서 배워 볼 예정이다. 넣어줘야 할 값은 메인에서 클래스 객체를 생성해줘야만 할 수 있다!
//가정을 해본다.
class Car{
int e;
int n;
void 운전() //메소드
{
운전;
정지;
}
}
Car c = new Car(); // 객체생성
static이 있는 클래스의 경우 객체 생성을 하지 않고도 불러다 사용할 수 있다. 그러나 static이 없는 경우 객체생성을 해줘야한다. 객체 생성을 하는 순간 해당 메모리 안에 첫번째 주소가 들어간다(배열과 참조변수를 생각하면 됨). 그 방에는 운전이라는 방, 정지라는 방들으로 갈 수 있는데 위처럼 c 변수에다가 이런 운전, 정지 등등 메소드(기능)들을 대입(주소)시키고 갖고와서 사용할 수 있다. c는 Car 객체의 인스턴스이다.
인스턴스 - 객체가 메모리에 할당되어 실제 사용될 때 인스턴스 라고 함. 객체는 클래스의 인스턴스 다 같은 말이다.
Car c2 = new Car();
이런식으로 새롭게 객체 생성을 하는 경우 c1과 c2는 다른 주소를 참조한다. 다른 집에 산다고 생각하면 되는데 클래스는 하나 라서 같은 재료를 사용하지만, 객체는 주소가 다르니까 각각 다른 주소값을 할당 받는 것이다. 아파트에서 위아래 층의 구조가 똑같지만 가구와 사는 사람이 다른 것처럼 생각하면 쉽다.
객체의 구성 요소
속성(property) : 멤버 변수(member variable), 특성(attribute), 필드(field), 상태(state)
기능(funtion) : 메소드(method), 함수(function), 행위(behavior)
class Tv
{
String color;
boolean power;
int channel;
void power()
{
power = !power;
}
void channelUp()
{
++channel;
}
void channelDown()
{
--channel;
}
}
먼저 클래스를 만들어준다. 보통은 다른 파일에 있는 걸 불러와서 사용하지만 여기서는 한 파일에 넣어주었다. 실제 파일로 저장이 될 때는 각 다른 파일로 저장이 된다. 그러니 위치는 맨 위 맨 아래 어떤 곳도 상관 없다. 클래스 안에는 지역변수 세개와 메소드 세개가 있다. 전원을 켰다 끄고, 채널 조절이 가능하다.
Tv t = new Tv(); //Tv는 t 객체의 인스턴스이다.
Tv t2 = new Tv();
t.channel = 11;
t.channelUp();
System.out.println("현재 채널은 " + t.channel +" 입니다.");
t.channelDown();
System.out.println("현재 채널은 " + t.channel +" 입니다.");
t.channelDown();
System.out.println("현재 채널은 " + t.channel +" 입니다.");
//t2 channel을 5번으로 초기화 시키고 채널을
t2.channel = 5;
for(int i=1; i<=6; i++)
{
t2.channelUp();
}
System.out.println("현재 t2채널은 " + t2.channel +" 입니다.");
t2.channelDown();
t2.channelDown();
System.out.println("현재 t2채널은 " + t2.channel +" 입니다.");
현재 채널은 12 입니다. 현재 채널은 11 입니다. 현재 채널은 10 입니다. 현재 t2채널은 11 입니다. 현재 t2채널은 9 입니다. |
클래스 사용을 위해서 객체 생성을 해주었고
여기서 Tv t = new Tv(); Tv의 경우
t의 인스턴스 라고 한다.
/*
* t1의 channel값은 0입니다.
* t2의 channel값은 0입니다.
* t1의 channel값은 7로 변경 합니다.
* t1의 channel값은 7입니다.
* t2의 channel값은 7입니다.
*
* 객체 생성은 따로따로 하나 한 곳을 바라보게끔 한다.
*/
Tv t1 = new Tv();
Tv t2 = new Tv();
System.out.println("t1의 channel값은 " + t1.channel +"입니다.");
System.out.println("t2의 channel값은 " + t2.channel +"입니다.");
t2 = t1;
System.out.println("t1의 channel값은 7로 변경 합니다.");
t1.channel = 7;
System.out.println("t1의 channel값은 " + t1.channel +"입니다.");
System.out.println("t2의 channel값은 " + t2.channel +"입니다.");
t1의 channel값은 0입니다. t2의 channel값은 0입니다. t1의 channel값은 7로 변경 합니다. t1의 channel값은 7입니다. t2의 channel값은 7입니다. |
t1과 t2의 객체 생성을 해줍니다. 값을 정하진 않았지만 채널의 데이터 타입이 int라서 자동으로 0이 들어가기 때문에 둘 다 0이 출력된다. 그 다음 t2 = t1 이렇게 t2에 t1의 주소값을 대입해서 이젠 클래스 뿐만 아니라 주소값까지 같이 공유를 하는 사이가 되었다. 때문에 어느 한곳에서 값을 바꿔도 둘 다 그 값이 적용된다는 걸 알면 된다.
'개발일지 > Java + Spring' 카테고리의 다른 글
211022 Java - 메소드(클래스/인스턴스/기본형/참조형) (0) | 2021.10.22 |
---|---|
클래스 파일 확인 - 같은 파일에 있는 클래스가 나눠져서 저장? (0) | 2021.10.21 |
211020 Java - 시험 풀이 (0) | 2021.10.20 |
211020 Java - Array 배열 복사 하는 방법과 메소드 (0) | 2021.10.20 |
211019 Java - Array (0) | 2021.10.19 |