로또번호는 1 ~ 45까지의 숫자가 중복되지 않으면서 출력되어야 한다.
public class Lotto {
public static void main(String[] args) {
// 1. 중복되지 않은 6개의 정수를 추출하여 배열에 저장한다.
// 2. 오름차순으로 정렬하여 보여준다.
int num = 6; // ball의 개수
int[] ball = new int[num]; // 랜덤하게 추출한 정수를 저장할 변수
int temp;
for (int i = 0; i < num; i++) {
ball[i] = (int) (Math.random() * 45 + 1);
if (i > 0) {
for (int j = 0; j < i; j++) {
if (ball[i] == ball[j]) {
i--;
break;
}
}
}
System.out.print(ball[i] + "\t");
}
System.out.println();
for (int i = 0; i < num; i++) {
for (int j = 0; j < num - 1 - i; j++) {
if (ball[j] > ball[j + 1]) {
temp = ball[j];
ball[j] = ball[j + 1];
ball[j + 1] = temp;
}
}
}
for (int k = 0; k < num; k++) {
System.out.print(ball[k] + "\t");
}
}
}
ball 배열에 첫번째 방부터 랜덤 한 숫자를 넣어준다.
이때 두번째 생성된 방부터는 앞서 생성된 방과 중복된 숫자가 나왔는지 비교해 주어야 한다.
if 문을 사용해 i가 0보다 클 경우, i번 방과 j번방을 비교해 중복 값이 없으면 넘어가고 중복된다면 i값을 줄여주고
if( i > 0)문 안쪽 for문을 break 해준다.
예를 들어 i가 4가 된다면 ball [4] == ball [0], ball [1], ball [2], ball [3] 이랑 비교해 중복되는 값이 있는지 확인하는 것이다.
중복이 나와 i값이 줄어들고, 다시 for문에 의해 i값이 늘어난 다음 새로운 랜덤값을 부여받는다. 그 후 다시 비교한다.
(j의 범위는 i보다 작음)
객체와 클래스
클래스 : 객체를 정의해 놓은것. 객체의 설계도
객체 : 클래스에 정의된 내용대로 메모리에 생성된 것을 뜻한다.
클래스 → 인스턴스화 → 인스턴스(객체)
[인스턴스 생성방법]
클래스명 참조변수명; // 객체를 다루기 위한 참조변수를 선언한다.
참조변수명 = new 클래스명(); // 객체를 생성한 후에 생성된 객체의 주소를 참조 변수에 저장한다.
Tv t;
t = new Tv();
Tv t = new Tv();
sts
같은 패키지 안에 똑같은 파일명을 만들면 안된다.
Package Presentation →
Flat: 있는대로 보여줌
Hierarchical: 구조적인 형태로 보여줌
package object.tv1;
//-------------------------------------------
// class Tv
//-------------------------------------------
class Tv {
// 멤버 변수
String color; // 색깔
boolean power; // on/off 스위치
int channel; // 채널
// 기능
void power() { power = !power; } // TV를 켰다 껐다 하는 기능
void channelUp() { ++channel; } // 채널을 1 올린다.
void channelDown() { --channel; } // 채널을 1 내린다.
// 기본적으로 멤버변수의 값이 바뀐다.
} // End - class Tv
//-------------------------------------------
// public class TvExam
//-------------------------------------------
public class TvExam {
public static void main(String[] args) {
Tv t; // Tv를 가리키는 참조변수를 선언한다.
t = new Tv(); // Tv를 생성한다.
t.channel = 11;
System.out.println("현재 채널은 " + t.channel + "번 입니다."); // 11
t.channelDown(); //메서드 호출
System.out.println("현재 채널은 " + t.channel + "번 입니다."); // 10
}
} // End - public class TvExam
참조변수에 생성자를 사용해서 객체를 만들면 새로운 메모리를 차지하게 된다.
Tv t1 = new Tv();
Tv t1 = new Tv();
package object.tv2;
//-------------------------------------------
// class Tv
//-------------------------------------------
class Tv {
// 멤버 변수
String color; // 색깔
boolean power; // on/off 스위치
int channel; // 채널
// 기능
void power() { power = !power; } // TV를 켰다 껐다 하는 기능
void channelUp() { ++channel; } // 채널을 1 올린다.
void channelDown() { --channel; } // 채널을 1 내린다.
// 기본적으로 멤버변수의 값이 바뀐다.
} // End - class Tv
//-------------------------------------------
// public class TvExam
//-------------------------------------------
public class TvExam {
public static void main(String[] args) {
Tv t1 = new Tv();
Tv t2 = new Tv(); // 둘은 전혀 다른 객체. 메모리 별도로 잡고있음
System.out.println("t1의 채널 : " + t1.channel); // 0
System.out.println("t2의 채널 : " + t2.channel); // 0
t1.channel = 8;
System.out.println("t1의 채널 : " + t1.channel); // 8
System.out.println("t2의 채널 : " + t2.channel); // 0
}
} // End - public class TvExam
package object.tv3;
//-------------------------------------------
// class Tv
//-------------------------------------------
class Tv {
// 멤버 변수
String color; // 색깔
boolean power; // on/off 스위치
int channel; // 채널
// 기능
void power() { power = !power; } // TV를 켰다 껐다 하는 기능
void channelUp() { ++channel; } // 채널을 1 올린다.
void channelDown() { --channel; } // 채널을 1 내린다.
// 기본적으로 멤버변수의 값이 바뀐다.
} // End - class Tv
//-------------------------------------------
// public class TvExam
//-------------------------------------------
public class TvExam {
public static void main(String[] args) {
Tv t1 = new Tv();
Tv t2 = new Tv();
System.out.println("t1의 채널 : " + t1.channel);
System.out.println("t2의 채널 : " + t2.channel);
t2= t1;
t1.channel = 11;
System.out.println("t1의 채널 : " + t1.channel); // 11
System.out.println("t2의 채널 : " + t2.channel); // 11
}
} // End - public class TvExam
t1.channel 값만 바꿨는데 왜 t2의 채널도 바뀌었을까?
t1과 t2는 둘 다 참조변수이다. (같은 주소값을 가리키고있다)
서로 다른 메모리 주소값을 가리키고 있었는데 t2 = t1; 이라는 대입을 만나 같은 주소값을 가리키게 된다.
같은 주소값을 가리키고 있게 되었으니 t2의 값을 바꿔도 t1도 같이 바뀐다. (그냥 둘이 아예 똑같아진다.)
비어있는 삼각형 : 내가 만든 클래스의 멤버 변수
색이 들어있는 삼각형 : 내가 만든 클래스의 메서드
원 : 자바의 기본 메서드
변수의 종류
변수의 종류 | 선언위치 | 생성시기 |
클래스 변수 (static) | 클래스 영역 | 클래스가 메모리에 올라갈 때 |
인스턴스 변수 | 클래스 영역 | 인스턴스가 생성될 때 |
지역변수 | 지역 영역 | 변수 선언문이 실행될 때 |
package object.card1;
//-------------------------------------------
//class Card
//-------------------------------------------
class Card {
String kind; // 카드의 무늬 - 인스턴스 변수
int number; // 카드의 숫자 - 인스턴스 변수
static int width = 120; // 카드의 폭 - 클래스 변수
static int height = 260; // 카드의 높이 - 클래스 변수
} // End - class Card
//-------------------------------------------
//public class CardExam
//-------------------------------------------
public class CardExam {
public static void main(String[] args) {
System.out.println("카드의 폭 : " + Card.width);
System.out.println("카드의 높이 : " + Card.height);
// System.out.println("카드의 숫자 : " + Card.number); 에러
Card c1 = new Card();
c1.kind = "Heart";
c1.number = 4;
Card c2 = new Card();
c2.kind = "Diamond";
c2.number = 9;
System.out.println("C1 => " + c1.kind + ", " + c1.number + ", " + c1.width + ", " + c1.height);
System.out.println("C2 => " + c2.kind + ", " + c2.number + ", " + c2.width + ", " + c2.height);
c1.width = 200;
c2.height = 400;
System.out.println("C1 => " + c1.kind + ", " + c1.number + ", " + c1.width + ", " + c1.height);
System.out.println("C2 => " + c2.kind + ", " + c2.number + ", " + c2.width + ", " + c2.height);
}
} // End - public class CardExam
인스턴스 변수를 사용하려면 참조 변수 생성이 필요하다.
클래스(static) 변수의 값은 객체에서도 바꿀 수 있다. (해당 클래스를 사용하는 모든 객체의 static 변수 값은 바뀌게 된다.)
'Language > Java' 카테고리의 다른 글
[Java] 명명 규칙 (0) | 2022.07.31 |
---|---|
[Java] 자바 기초 (0) | 2022.07.31 |
[Java] 배열 (Array) 기초 (0) | 2022.07.30 |
[Java] Java기초 (0) | 2022.07.30 |
[Java] 자바소스와 컴파일 (0) | 2022.07.30 |