C에서는 고정할당 배열방식과 비슷함
동적할당(malloc) 복습필요할듯..
배열 (array)
int [] intArray = {4,3,2} //JAVA
<=> int Array[] = {4,3,2} //c
레퍼런스 구조
사이즈를 주지않아도 자동으로 공간을 만들고 값을 초기화해서 이어주는 구조를 만듦
배열이란?
: 인덱스와 인덱스에 대응하는 데이터들로 이루어진 자료 구조
- 인덱스는 배열의 시작 위치에서부터 데이터가 있는 상대 위치
- 배열을 이이용하면 한 번에 많은 메모리 공단 할당 가능
- 같은 타입의 데이터들이 순차적으로 저장
- 인덱스를 이용하여 원소 데이터 접근
- 반복문을 이용하여 처리하기에 적합
- 배열 인덱스 : 0부터 시작 5칸의 경우 인덱스는 [0],[1],[2],[3],[4]
- 레퍼런스 타입레퍼런스 변수와 배열둘 다 가능
intArray : int [] int Array; int intArray[];

new가 malloc이랑 거의 똑같은 작업을 함.
배열 선언 + 배열 생성의 두 단계가 필요하다
int intArray[]; // 1
int[] int Array; //2
intArray = new int[10]; //
int[] intArray = new int[10]; // 선언과 동시에 생성
배열 선언 시 값 초기화
int [] intArray = {0,1,2,3,4,5,6,7,8,9} // 초기화된 값의 개수 10만큼 자동으로 생성함
인덱스의 경우, 음수는 불가능하다.
레퍼런스 치환과 배열 공유
- 하나의 배열을 다수의 레퍼런스가 참조 가능
- int [] intArray = new int[5];
- int [] myArray = intArray; //배열은 주소이기때문~
int Array = new int[10];을 실행한다면, int Array에는 새로운 공간이 할당된다!
배열의 크기, length 필드
배열은 자바에서 객체로 관리
배열 객체 내의 length필드는 배열의 크기를 나타낸다.
int intArray[];
int Array = new int[5];
int size = intArray.length; // size는 5
배열과 for-each 문
배열이나 나열의 각 원소를 순차적으로 접근하는데 유용한 for문
for ( 배열의 원소타입 변수 : 배열){
...
}
String [] names = {"사과", .....};
for (String s : names) // 반복할때마다 s는 name[0], name[1] , ....로 설정됨
System.out.print(s+" ")
2차원 배열
int[][] intArray; // int intArray[][]; 도 가능하지만 전자 권장
char[][] charAttay;
[]괄호 안에 값 입력 시, 선언과 동시에 생성 가능.
int [][] intArray = new int[2][5];
int [][] intArray = {{0,1,2,},{3,4,5}}; // 선언,생성,초기화
2차원 배열의 구조와 length 필드
int[][] i = new int[2][5]
int size1 = i.length; // 2 , 2차원 배열의 행의 개수
int size2 = i[0].length; // 5, 2차원 배열 중 0번째 행의 열의 개수
비정방형 배열
- 정방형 배열
- 각 행의 열의 개수가 같은 배열
- 비정방형 배열
- 각 행의 열의 개수가 다른 배열
- 비정방형 배열의 생성
-
int [][]; i = new int[4][]; i[0] = new int[1]; // 한칸생성 i[0][0] i[1] = new int[2]; // 두칸생성 i[1][0] i[1][1] ... i[3] = new int[4]; //4 칸생성 i[3][0] i[3][1] i[3][2] i[3][3] i.length // 2차원 배열의 행의 개수이므로 4 출력 i[3].length // 위와 같이 입력하면 3번째 행의 열의 개수이므로 4 출력
행크기 만들어서 보여주는 실습
package week5;
import java.util.Scanner;
public class 행크기 {
public static void main(String args[]) {
Scanner input= new Scanner(System.in);
// 행크기를 입력받아서 각 행마다 1부터 하나씩 증가시켜 열만들기
int [][] arr;
System.out.print("행크기 : ");
int row = input.nextInt();
arr = new int [row][]; //동적할당 층크기부터 만들고 그 다음에 열채운다.
//2차구조에서 1차구조만 생성한 것! 앞족에 항상 써줘야함! [][row]는 불가능하다는 의미다!
//반복
for (int i =0 ; i< arr.length; i++) {
//각 행마다 열크기 할당하기
arr[i] = new int[i+1];
}
showArray(arr);
}
private static void showArray(int[][] arr) {
//private 현재는 아무런 문제가 발생하지 않는다.
for(int row = 0; row<arr.length; row++) {
System.out.printf("%2d : ", row+1);
for(int col = 0; col<arr[row].length; col++) {
System.out.print(arr[row][col] + " ");
}
System.out.println();
}
}
}
메소드의 배열 리턴
메소드에서 만든 배열의 레퍼런스 리턴
메소드에서의 리턴타입
+ 메소드의 리턴 타입과 리턴 받는 배열 타입과 일치
+ 리턴 타입에 배열의 크기를 지정하지 않음.
++얼튜비튜 추가++
Scanner 이용해서 입력받을 때, int형만 받을 때는 nextInt()만 사용하면됨
tmp = input.nextLine(); << 필요없는 구문이다.
bakjoon 2566,2738
25.04.03(목, 2차원배열)
극장예약시스템 배열이 1~10으로 설정
package week5;
import java.util.Scanner;
// 1. 환영
// 2. 메뉴보이기
// 3. 메뉴입력받기
// 4. 메뉴에 따라 동작하기
// 5.반복하기!
public class 극장예약시스템 {
static Scanner input = new Scanner(System.in); //static 해줘야하는 이유?
public static void showWelcome() {
System.out.println("*****************************************************");
System.out.println(" WELCOME TO EWHA THEATER ");
System.out.println("*****************************************************");
}
private static void 메뉴보이기() {
System.out.println("###########################################################");
System.out.println("1.예약하기 2.취소하기 3.좌석보이기 0.종료하기");
System.out.println("###########################################################");
}
private static void 예약하기(int[][] seats) {
//continue ? :
//행과 열을 입력받아서 1로 채운다.
System.out.println("행과 열을 입력받아 좌석을 예약합니다!");
System.out.printf("행을 입력하세요(0~%d) : ",seats.length); int 행 = input.nextInt();
System.out.printf("열을 입력하세요(0~%d) : ",seats[0].length); int 열 = input.nextInt();
if (행 <1 || 행 > seats.length-1 ) {
System.out.println("입력 범위(행)를 다시 확인하십시오.");
return;
}
if( 열 <1 || 열 > seats[0].length-1) {
System.out.println("입력 범위(열)를 다시 확인하십시오.");
return;
}
if (seats[행-1][열-1] == 1) {
System.out.println("이미 예약된 좌석입니다.");
return;
}
seats[행-1][열-1] = 1;
}
private static void 취소하기(int[][] seats) {
//continue ? :
//행과 열을 입력받아서 1로 채운다.
System.out.println("행과 열을 입력받아 좌석을 취소합니다!");
System.out.printf("행을 입력하세요(1~%d) : ",seats.length); int 행 = input.nextInt();
System.out.printf("열을 입력하세요(1~%d) : ",seats[0].length); int 열 = input.nextInt();
if (행 <1 || 행 > seats.length ) {
System.out.println("입력 범위(행)를 다시 확인하십시오.");
return;
}
if( 열 <1 || 열 > seats[0].length) {
System.out.println("입력 범위(열)를 다시 확인하십시오.");
return;
}
if (seats[행-1][열-1] == 0) {
System.out.println("예약된 자리가 아닙니다.");
return;
}
seats[행-1][열-1] = 0;
}
private static void 좌석보이기(int[][] seats) {
for(int i=1; i<=seats.length; i++) {
System.out.printf("[%d]\t ",i);
for(int j=1;j<=seats[0].length;j++) {
if(seats[i-1][j-1] ==1) System.out.print("■ ");
else System.out.print("□ ");
}
System.out.println();
}
}
public static void main(String[] args) {
int[][] seats = new int[10][10];
int menu;
showWelcome();
while(true) {
메뉴보이기();
System.out.print("메뉴 입력 : ");
menu = input.nextInt();
if (menu ==0) break;
else if(menu ==1) 예약하기(seats);
else if (menu ==2) 취소하기(seats);
else if(menu ==3) 좌석보이기(seats);
}
System.out.println("이화 극장 예약시스템을 종료합니다.");
}
}
#랜덤 수 만들기: 0~100까지
1. Math.random() 메소드이용
0.0-1.0까지의 실수를 리턴.
0부터 100까지를 얻으려면? Math.random()*1000 or 100000을 곱하고 나머지 연산자(%) 활용
2. Random 클래스 이용
Random r = new Random(); // 랜덤클래스로 r 생성 후
r.nextInt() // 이용하여 정수를 얻음.
범위는 -21 ~ 21억 사이의 정수를 리턴.
범위를 0부터 100으로 설정하려면? 일단 양수로 처리하고, 나머지 연산자(%)를 이용하여 0부터 100까지 수를 얻어내면 됨.
public class RandomExample {
public static void main(String[] args) {
System.out.println("0.0 ~ 1.0 사이의 난수 1개 발생 : " + Math.random());
System.out.println("0 ~ 10 사이의 난수 1개 발생 : " + (int)((Math.random()*10000)%10));
System.out.println("0 ~ 100 사이의 난수 1개 발생 : " + (int)(Math.random()*100));
}
}
Math.random() 은 현재 시간을 시드값으로 사용한다.
Math.random( )을 정수로 사용하기
1. random의 값을 충분히 높여준 뒤 나머지 연산을 합니다. 나머지 연산 값보다 무조건 작은값이 나옵니다.
2. random의 값을 원하는 자리수만큼 곱한 뒤 int형으로 변환하면 소수점 단위는 자동 절삭되어 정수형으로 표현이 가능합니다.
Random클래스 주요 메서드
| 메서드 | 설명 |
| setSeed(long n) | 매개값으로 주어진 종자값이 설정됩니다. |
| boolean nextBoolean() | boolean타입의 난수를 리턴합니다. |
| double nextDouble() | doouble 타입의 난수를 리턴합니다. |
| int nextInt() | int 타입의 난수를 리턴합니다. |
| int nextInt(int n) | int 타입의 0 ~ 매개값까지의 난수를 리턴합니다. |
| double nextGaussian() | 평균이 0.0이고 표준편차가 1.0인 정규분포 난수를 리턴합니다. |
'컴퓨터공학과 > Java 1 & 2' 카테고리의 다른 글
| WEEK7 . chap05-class (0) | 2025.04.15 |
|---|---|
| Week6 : JAVA프로그래밍및실습 (0) | 2025.04.11 |
| JAVA 지뢰찾기 (0) | 2025.04.04 |
| JAVA 프로그래밍 및 실습 추가학습 (0) | 2025.04.03 |
| [#실습2 JAVA프로그래밍및실습 I ] (0) | 2025.03.18 |