참조타입
- 객체의 번지를 참조하는 타입입니다.
- 배열, 열거, 클래스, 인터페이스 타입이 있습니다.
- 기본타입으로 선언된 변수는 값 자체를 저장하지만, 참조 타입으로 선언된 변수는 객체가 생성된 메모리 번지를 저장합니다.
객체란,
데이터와 메소드로 구성된 덩어리 입니다.



코드, 데이터, 메소드, 힙, 스택 영역
JVM은 운영체제에서 할당 받은 메모리 영역을 코드, 데이터영역, 메소드영역, 힙영역, 스택영역으로 구분해서 사용합니다.
- 코드 영역 : 메모리의 코드영역은 실행할 프로그램이 코드가 저장되는 영역으로 텍스트 영역이라고도 한다.
- CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리하게 된다.
프로그램이 시작하고 종료될 때 까지 메모리에 계속 남아있는다.
- CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리하게 된다.
- 데이터 영역 : 메모리의 데이터 영역은 프로그램의 전역변수와 정적변수가 저장되는 영역입니다.
- 데이터 영역은 프로그램 시작과 함께 할당되며, 프로그램이 종료되면 소멸합니다.
- 메소드 영역 : 바이트 코드파일을 읽은 내용이 저장되는 영역입니다.
- 힙 영역 : 객체가 생성되는 영역, 객체의 번지는 메소드 영역과 스택영역의 상수와 변수에서 참조합니다.
- 메모리의 힙영역은 사용자가 직접 관리할수 있는 '그리고 해야만 하는' 메모리 영역입니다.
힙 영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제됩니다.
힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당됩니다.
- 메모리의 힙영역은 사용자가 직접 관리할수 있는 '그리고 해야만 하는' 메모리 영역입니다.
- 스택 영역 : 메소드를 호출할 때마다 생성되는 프레임이 저장되는 영역
- 메모리의 스택 영역은 함수의 호출과 관계되는 지역변수와 매개변수가 저장되는 영역입니다.
스택 영역은 push 동작으로 데이터를 저장하고 pop 동작으로 데이터를 인출합니다.
스택은 후입선출(Last-In First-Out) 방식에 따라 동작하므로, 가장 늦게 저장된 데이터가 가장 먼저 인출됩니다.
(!=FIFO, First-In First-Out)
스택영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당됩니다.
- 메모리의 스택 영역은 함수의 호출과 관계되는 지역변수와 매개변수가 저장되는 영역입니다.
==, != 연산자
- ==, != 연산자는 객체의 번지를 비교해 변수의 값이 같은지 아닌지를 조사합니다.
- 번지가 같다면 동일한 객체를 참조하는 것이고, 다르다면 다른 객체를 참조하는 것입니다.

null값
null값 : 참조 타입 변수는 아직 번지를 저장하고 있지 않다는 뜻입니다.
null도 초기값으로 사용할수 있기 때문에 null로 초기화 된 참조 변수는 스택영역에 생성됩니다.
NullPointerException
변수가 null 인 상태에서 객체의 데이터나 메소드를 사용하려 할때 발생하는 예외입니다.
참조 변수가 객체를 정확히 참조하도록 번지를 대입해야 해결됩니다.

public class referance {
public static void main(String[] args) {
int[] intArray = null;
intArray[0] = 10;
String str = null;
System.out.println("총 문자 수 : " + str.length());
}
}
String 타입
문자열은 string 객체로 생성됩니다.
String name; //String 타입 변수 name을 null값으로 초기화 선언
name = "홍길동"; //name 변수에 문자열 대입
String hobby = "여행"; // String 타입 변수 hobby를 선언하고 문자열 대입.

문자열 비교
문자열 리터럴이 동일하다면 String 객체를 공유합니다.
String name1 = "홍길동";
String name2 = "홍길동";

new 연산자(객체 생성 연산자)로 직접 String 객체를 생성/대입 가능합니다.
예시입니다.
public class referance {
public static void main(String[] args) {
int[] arr1; //배열 변수 arr1 선언
int[] arr2; //배열 변수 arr2 선언
int[] arr3; //배열 변수 arr3 선언
arr1=new int[] {1,2,3}; // 배열 {1,2,3}을 생성하고 arr1 변수에 대입
arr2=new int[] {1,2,3}; // 배열 {1,2,3}을 생성하고 arr2 변수에 대입
arr3=arr2; // 배열 변수 arr2의 값을 arr3에 대입합니다.
System.out.println(arr1 == arr2); // 참조하는 주소에 대한 부분이 달라서 false
System.out.println(arr2 == arr3); // 참조하는 주소에 대한 부분이 같기때문에 true
}
}
결과 :
false
true
다른 예시입니다.
public class referance {
public static void main(String[] args) {
String hobby = "여행";
hobby = null; //여행값을 참조하는 주소가 사라지게 됩니다.
String kind1 = "자동차";
String kind2 = kind1;
kind1 = null; // "자동차" 값에 대한 참조주소를 제거한다면?
// 그래도 kind2는 여전히 "자동차"에 대한 참조주소를 여전히 갖고있습니다.
System.out.println("kind2: " + kind2);
}
}
결과 :
kind2: 자동차
세번째 예시!
public class referance {
public static void main(String[] args) {
String strVar1 = "홍길동";
String strVar2 = "홍길동";
if(strVar1 == strVar2) { // == 번지값을 비교
System.out.println("strVar1과 strVar2는 참조가 같음");
} else {
System.out.println("strVar1과 strVar2는 참조가 다름");
}
if(strVar1.equals(strVar2)) { // equals 데이터의 값을 비교
System.out.println("strVar3와 strVar4는 문자열이 같음");
}
String strVar3 = new String("홍길동"); // 객체로 생성 새로운 주소값과 데이터가 따로 저장이 됩니다.
String strVar4 = new String("홍길동"); // 객체로 생성 새로운 주소값과 데이터가 따로 저장이 됩니다.
if(strVar3 == strVar4) { // == 번지값을 비교..참조 주소가 다릅니다.
System.out.println("strvar3와 strvar4는 참조가 같음");
}else {
System.out.println("strvar3와 strvar4는 참조가 다름");
}
if(strVar3.equals(strVar4)) { // equals 데이터 값은 동일합니다.
System.out.println("strVar3와 strVar4는 문자열이 같음");
}
}
}
결과 :
strVar1과 strVar2는 참조가 같음
strVar3와 strVar4는 문자열이 같음
strvar3와 strvar4는 참조가 다름
strVar3와 strVar4는 문자열이 같음
public class referance {
public static void main(String[] args) {
String hobby = "";
if(hobby.equals("")) {
System.out.println("hobby 변수가 참조는 String, 객체는 빈 문자열");
}
}
}
결과 :
hobby 변수가 참조는 String, 객체는 빈 문자열
문자열 추출
- charAt() 메소드로 문자열에서 매개값으로 주어진 인덱스의 문자를 리턴해 특정 위치의 문자를 얻을수 있습니다.

public class referance {
public static void main(String[] args) {
// 주민등록번호의 값을 이용하여 성별확인
// 생년월일성별 222(성별) 1 2 3 4
// 7번째 자리의 값을 불러옵니다.
String ssn = "9506241230123";
char sex = ssn.charAt(6); // charAt : 문자열에서 색인값으로 문자를 추출할때
switch(sex) {
case '1':
case '3':
System.out.println("남자입니다.");
break;
case '2':
case '4':
System.out.println("여자입니다.");
break;
}
}
}
결과 :
남자입니다.
문자열 길이
- 문자열에서 문자의 개수를 얻고싶다면 length() 메소드를 사용합니다.

public class referance {
public static void main(String[] args) {
String ssn = "9506241230123";
int length = ssn.length(); // length 문자의 개수를 반환
if(length == 13){
System.out.println("주민등록번호 자리수가 맞습니다.");
} else {
System.out.println("주민등록번호 자릿수가 틀립니다.");
}
}
}
결과 :
주민등록번호 자리수가 맞습니다.
문자열 대체
replace() 메소드는 기존 문자열은 그대로 두고, 대체한 새로운 문자열을 생성하여 리턴합니다.
public class referance {
public static void main(String[] args) {
String oldStr = "자바 문자열은 불변입니다. 자바 문자열은 String 입니다.";
String newStr = oldStr.replace("자바", "JAVA");
System.out.println(oldStr);
System.out.println(newStr);
}
}
자바 문자열은 불변입니다. 자바 문자열은 String 입니다.
JAVA 문자열은 불변입니다. JAVA 문자열은 String 입니다.

문자열 잘라내기
문자열에서 특정 위치의 문자열을 잘라내어 가져오고 싶다면 substring() 메소드를 사용합니다.
| 메소드 | 설명 |
| substring(int beginIndex) | beginIndex에서 끝까지 잘라내기 |
| substring(int beginIndex, int endIndex) | beginIndex에서 endIndex 앞까지 잘라내기 |
주민등록번호 예제를 잘라봅시다.
public class referance {
public static void main(String[] args) {
String ssn = "880815-1234567";
// 앞자리 생년월일만 추출할떄
String firstNum = ssn.substring(0,6);
// 시작과 끝인덱스를 지정해야할때, 끝 인덱스에서는 포함할 인덱스번호의 뒷번호를 지정해줘야 합니다.
// i <= x < j 처럼!
System.out.println(firstNum);
String secondNum = ssn.substring(7);
// 시작 인덱스를 지정하고 끝까지 자르기
System.out.println(secondNum);
System.out.println(ssn);
}
}
결과 :
880815
1234567
880815-1234567
문자열 찾기
문자열에서 특정 문자열의 위치를 찾고자 할때는 indexOf() 메소드를 사용합니다.

예시입니다.
public class referance {
public static void main(String[] args) {
String subject = "자바 프로그래밍";
int location = subject.indexOf("프로그래밍");
System.out.println(location); // 인덱스값 출력
String subString = subject.substring(location);
System.out.println(subString);
location = subject.indexOf("자바");
// indexOf()는 ()안에 해당하는 문자열이 기존 문자열 'subject'에 없을 경우 -1을 반환합니다.
if(location != -1) {
System.out.println("자바와 관련된 책이군요.");
}else {
System.out.println("자바와 관련없는 책이군요.");
}
boolean result = subject.contains("자바");
if(result) {
System.out.println("자바와 관련된 책이군요.");
}else {
System.out.println("자바와 관련없는 책입니다.");
}
}
}
결과 :
3
프로그래밍
자바와 관련된 책이군요.
자바와 관련된 책이군요.
실습 예제입니다.
주어진 문자열 : 자바 프로그래밍은 어렵다!
문자열 길이를 출력하세요.
'어렵다' 라는 단어는 몇 번째 일까요?
바뀐 문자열 : "자바 프로그래밍은 쉽다!" 를 출력하세요.
public class referance {
public static void main(String[] args) {
String firstS = "자바 프로그래밍은 어렵다!";
int lengthFirst = firstS.length();
System.out.println("문자열 길이 : " + lengthFirst);
int hardNum = firstS.indexOf("어렵다");
System.out.println("어렵다 단어는 " + (hardNum + 1) + "번째 위치에 존재하고, 시작 index 번호는 " + hardNum + "입니다.");
String changeFirsts = firstS.replace("어렵다", "쉽다");
System.out.println(changeFirsts);
}
}
결과:
문자열 길이 : 14
어렵다 단어는 11번째 위치에 존재하고, 시작 index 번호는 10입니다.
자바 프로그래밍은 쉽다!
문자열 분리
구분자가 있는 여러개의 문자열을 분리할때 split() 메소드 를 사용합니다.

예시입니다.
public class referance {
public static void main(String[] args) {
String board = "1, 자바 학습, 참조 타입 String을 학습합니다., 홍길동";
// 문자열을 분리합니다.
String[] tokens = board.split(",");
System.out.println("번호 : " + tokens[0]);
System.out.println("번호 : " + tokens[1]);
System.out.println("번호 : " + tokens[2]);
System.out.println("번호 : " + tokens[3]);
System.out.println();
for(int i=0; i<tokens.length; i++) {
System.out.println(tokens[i]);
}
}
}
결과 :
번호 : 1
번호 : 자바 학습
번호 : 참조 타입 String을 학습합니다.
번호 : 홍길동
1
자바 학습
참조 타입 String을 학습합니다.
홍길동
문제를 한번 풀어보겠습니다.
이름, 학번과 학과를 입력하세요 : 홍길동/180257/컴퓨터공학과
이름:
학번:
학과:
이름을 입력하세요 : 홍길동
생년월일(mm/dd/yy)을 입력하세요 : 10/05/16
이름 : 홍길동
생년월일 : 16년 10월 05일
import java.util.Scanner;
public class referance {
public static void main(String[] args) {
String nameTag = "홍길동/180257/컴퓨터공학과";
String[] tagArray = nameTag.split("/");
System.out.println("이름 : " + tagArray[0]);
System.out.println("학번 : " + tagArray[1]);
System.out.println("학과 : " + tagArray[2]);
System.out.println();
System.out.println("----------------------------");
System.out.println();
Scanner sc = new Scanner(System.in);
System.out.print("이름을 입력하세요 : ");
String name = sc.nextLine();
System.out.print("생년월일(mm/dd/yy)을 입력하세요 : ");
String date1 = sc.nextLine();
String[] dateArray = date1.split("/");
System.out.println("이름 : " + name);
System.out.println("생년월일 : " + dateArray[2] + "년 " + dateArray[0] + "월 " + dateArray[1] + "일");
}
}
결과 :
이름 : 홍길동
학번 : 180257
학과 : 컴퓨터공학과
----------------------------
이름을 입력하세요 : John
생년월일(mm/dd/yy)을 입력하세요 : 11/06/93
이름 : John
생년월일 : 93년 11월 06일
1. '가을' 을 포함한 한줄의 문장을 입력 받아 '가을' 을 '봄' 으로 바꾸어 출력해보세요.
2. 4개의 과일을 입력받아 역순으로 출력하세요.
import java.util.Scanner;
public class referance {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("가을을 포함한 한줄의 문장을 입력하세요.");
System.out.print(">");
String fallString = sc.nextLine();
String fallToSpring = fallString.replace("가을", "봄");
System.out.println(fallToSpring);
System.out.println();
System.out.println("------------------------");
System.out.println();
System.out.print("4개의 과일을 입력하세요.(단어간 공백사용) : ");
String fruit = sc.nextLine();
String[] fruitArray = fruit.split(" ");
System.out.println("입력된 과일을 역순으로 출력하면?");
for(int i=fruitArray.length-1; i>=0; i--) {
System.out.print(fruitArray[i] + " ");
}
sc.close();
}
}
결과 :
가을을 포함한 한줄의 문장을 입력하세요.
>가을이 너무 짧아요.
봄이 너무 짧아요.
------------------------
4개의 과일을 입력하세요.(단어간 공백사용) : 사과 포도 배 딸기
입력된 과일을 역순으로 출력하면?
딸기 배 포도 사과
배열
연속된 공간에 값을 나열시키고, 각 값에 인덱스를 부여해 놓은 자료구조입니다.
인덱스는 대괄호[]와 함께 사용하여 각 항목의 값을 읽거나 저장하는데 사용합니다.

배열 변수선언
두가지 형태로 작성. 첫 번째가 관례적 표기입니다.
타입[] 변수;
타입 변수[];
- 배열은 힙영역에 생성되고, 배열 변수(fruit, num...)는 힙영역의 배열 주소를 저장합니다.
- 참조할 배열이 없다면 배열 변수도 null로 초기화가 가능합니다.
값 목록으로 배열 생성
배열에 저장될 값의 목록이 있다면, 다음과 같이 간단하게 배열을 생성할수 있습니다.
타입[] 변수 = { 값0, 값1, 값2, 값3, ...};

예시입니다.
public class referance {
public static void main(String[] args) {
String[] season = {"Spring", "Summer", "Fall", "Winter"};
System.out.println("Season[0]: " + season[0]);
System.out.println("Season[1]: " + season[1]);
System.out.println("Season[2]: " + season[2]);
System.out.println("Season[3]: " + season[3]);
System.out.println();
season[1] = "여름";
System.out.println("season[1]: " + season[1]);
System.out.println();
int[] scores = {83, 90, 97};
int sum = 0;
for(int i=0; i<scores.length; i++) {
sum += scores[i];
}
System.out.println("총합 : " + sum);
double avg = (double)sum /3;
System.out.println("평균 : " + avg);
}
}
결과 :
Season[0]: Spring
Season[1]: Summer
Season[2]: Fall
Season[3]: Winter
season[1]: 여름
총합 : 270
평균 : 90.0
배열의 변수를 선언한 시점과 값 목록이 대입 되는 시점이 다르다면 new 타입[]을 중괄호 앞에 붙여줍니다.
타입은 배열 변수를 선언할 때 사용한 타입과 동일하게 지정합니다.
변수 = new 타입[] { 값0, 값1, 값2, 값3, ...};
예제입니다.
public class referance {
public static void main(String[] args) {
int[] scores; // 배열의 변수선언 : 값은 null
scores = new int[] {83,90,87};
//new 를 이용해서 데이터 값을 입력
int sum1 = 0;
for (int i=0; i<scores.length; i++) {
sum1 = sum1 + scores[i]; //sum1 += scores[i];
}
System.out.println("총합 : " + sum1);
System.out.println();
System.out.println("-------------------------");
// 배열을 매개값으로 주고, 메소드 호출
printItem( new int[] {83,90,97});
}
public static void printItem(int[] scores) {
for (int i=0; i<scores.length; i++) {
System.out.println("scores[" + i + "]: " + scores[i]);
}
}
}
결과 :
총합 : 260
-------------------------
scores[0]: 83
scores[1]: 90
scores[2]: 97
new 연산자로 배열생성
- new 연산자로 값의 목록은 없지만 향후 값들을 저장할 목적으로 배열을 미리 생성합니다.
타입[] 변수 = new 타입[길이];
- new 연산자로 배열을 처음 생성하면 배열 항목은 기본값으로 초기화 됩니다.

예시입니다.
public class referance {
public static void main(String[] args) {
int[] arr1 = new int[3]; // arr1 배열크기는 3: arr1[0], arr1[1], arr1[2]
for(int i=0; i<arr1.length; i++) {
System.out.print("arra1[" + i + "] : " + arr1[i] + ", ");
}
System.out.println();
arr1[0] = 10;
arr1[1] = 20;
arr1[2] = 30;
for(int i=0 ; i<3; i++) {
System.out.println("arra1[" + i + "] : " + arr1[i] + ", ");
}
System.out.println("\n");
double[] arr2 = new double[3];
for(int i=0; i<arr2.length; i++) {
System.out.print("arr2[" + "] : " + arr2[i] + ", ");
}
System.out.println("");
arr2[0] = 0.1;
arr2[1] = 0.2;
arr2[2] = 0.3;
for(int i=0; i<arr2.length; i++) {
System.out.print("arr2[" + i + "] : " + arr2[i] + ", ");
}
System.out.println("\n");
String[] arr3 = new String[3];
for(int i=0; i<arr3.length; i++) {
System.out.print("arr3[" + i + "] : " + arr3[i] + ", ");
}
System.out.println();
arr3[0] = "1월";
arr3[1] = "2월";
arr3[2] = "3월";
for(int i=0; i<arr3.length; i++) {
System.out.print("arr3[" + i + "] : " + arr3[i] + ", ");
}
}
}
결과 :
arra1[0] : 0, arra1[1] : 0, arra1[2] : 0,
arra1[0] : 10,
arra1[1] : 20,
arra1[2] : 30,
arr2[] : 0.0, arr2[] : 0.0, arr2[] : 0.0,
arr2[0] : 0.1, arr2[1] : 0.2, arr2[2] : 0.3,
arr3[0] : null, arr3[1] : null, arr3[2] : null,
arr3[0] : 1월, arr3[1] : 2월, arr3[2] : 3월,
배열 길이
- 배열의 길이란 배열에 저장할수 있는 항목의 수입니다.
- 코드에서 배열의 길이를 얻으려면 도트(.)연산자를 이용해 참조하는 배열의 length필드를 읽습니다.
배열변수.length;
- 배열의 length필드는 읽기만 가능하므로 값을 변경할 수는 없습니다.
- 배열 길이는 for문을 사용해서 전체 배열 항목을 반복할 때 많이 사용합니다.
다차원 배열
배열 항목에 또다른 배열이 대입된 배열입니다.

값 목록으로 다차원 배열 생성
값 목록으로 다차원 배열을 생성 시,
배열 변수 선언을 할때 타입 뒤에 대괄호[] 를 차원의 수만큼 붙이고,
값 목록도 마찬가지로 차원의 수만큼 중괄호를 중첩합니다.

예시입니다.
public static void main(String[] args) {
int[][] scores = { //2차원 배열 scores [2][3] == [2]행[3]열 2*3 = 6 개의 데이터를 입력합니다.
// 1차원 = 행, 2차원 = 열.
{80,90,96}, //[0][0], [0][1], [0][2]
{76,88} //[1][0], [1][1]
};
System.out.println("1차원 배열 길이 (반의 수): " + scores.length);
System.out.println("2차원 배열 길이 (첫 번째 반의 학생수): " + scores[0].length);
System.out.println("2차원 배열 길이 (두 번째 반의 학생수): " + scores[1].length);
System.out.println();
System.out.println("scores[0][2]: " + scores[0][2]);
System.out.println("scores[1][1]: " + scores[1][1]);
System.out.println();
int class1Sum = 0;
for(int i=0; i<scores[0].length; i++) {
class1Sum += scores[0][i]; // 첫번째 반의 각 삭생의 값을 가져와 class1Sum에 누적
}
double class1Avg=(double)class1Sum/scores[0].length;
System.out.println("첫 번째 반의 점수 총합: " + class1Sum);
System.out.println("첫 번째 반의 평균 점수: " + class1Avg);
System.out.println();
//두번째 반의 평균점수 구하기
int class2Sum = 0;
for(int i=0; i<scores[1].length; i++) {
class2Sum += scores[1][i];
}
double class2Avg = (double)class2Sum/scores[1].length;
System.out.println("두 번째 반의 점수 총합: " + class2Sum);
System.out.println("두 번째 반의 평균 점수: " + class2Avg);
System.out.println();
// 전체 학생의 평균점수 구하기
int totalStudent = 0;
int totalSum = 0;
for(int i=0; i<scores.length; i++) {
totalStudent += scores[i].length;
for(int k=0; k<scores[i].length; k++) {
totalSum += scores[i][k];
}
}
double totalAvg = (double) totalSum/totalStudent;
System.out.println("전체 학생의 평균 점수 : " + totalAvg);
}
}
결과 :
1차원 배열 길이 (반의 수): 2
2차원 배열 길이 (첫 번째 반의 학생수): 3
2차원 배열 길이 (두 번째 반의 학생수): 2
scores[0][2]: 96
scores[1][1]: 88
첫 번째 반의 점수 총합: 266
첫 번째 반의 평균 점수: 88.66666666666667
두 번째 반의 점수 총합: 164
두 번째 반의 평균 점수: 82.0
전체 학생의 평균 점수 : 86.0
new 연산자로 다차원 배열 생성
new 연산자로 다차원 배열을 생성 하려면 배열 변수 선언시 타입뒤에 대괄호[]를 차원의 수만큼 붙이고,
new 타입 뒤에도 차원의 수만큼 대괄호[]를 작성합니다.
타입[][] 변수 new 타입[1차원수][2차원수];

예제입니다.
public class referance {
public static void main(String[] args) {
// 각 반의 학생 수가 3명으로 동일한 경우
int[][] mathScores = new int[2][3];
for(int i=0; i<mathScores.length; i++) { // 반의 수 만큼 반복
for(int k=0; k<mathScores[i].length; k++) { // 해당반의 학생수 만큼 반복
System.out.println("mathScores[" + i + "][" + k + "]: " + mathScores[i][k]);
}
}
System.out.println();
mathScores[0][0] = 80;
mathScores[0][1] = 83;
mathScores[0][2] = 85;
mathScores[1][0] = 86;
mathScores[1][1] = 90;
mathScores[1][2] = 92;
int totalStudent = 0;
int totalMathSum = 0;
for(int i=0; i<mathScores.length; i++){
totalStudent += mathScores[i].length;
for(int k=0; k<mathScores[i].length; k++) {
totalMathSum += mathScores[i][k];
}
}
double totalMathAvg = (double)totalMathSum/totalStudent;
System.out.println("전체 학생의 수학 전체 점수: " + totalMathSum);
System.out.println("전체 학생의 수학 평균 점수: " + totalMathAvg);
System.out.println();
//각 반의 학생 수가 다른 경우
int[][] englishScores = new int[2][];
englishScores[0] = new int[2];
englishScores[1] = new int[3];
for(int i=0; i<englishScores.length; i++) { // 반의 수 만큼 반복
for(int k=0; k<englishScores[i].length; k++) { // 해당반의 학생수 만큼 반복
System.out.println("mathScores[" + i + "][" + k + "]: " + englishScores[i][k]);
}
}
System.out.println();
// 배열 값 변경
englishScores[0][0] = 90;
englishScores[0][1] = 91;
englishScores[1][0] = 92;
englishScores[1][1] = 93;
englishScores[1][2] = 94;
totalStudent = 0;
int totalEnglishSum = 0;
for(int i=0; i<englishScores.length; i++){
totalStudent += englishScores[i].length;
for(int k=0; k<englishScores[i].length; k++) {
totalEnglishSum += englishScores[i][k];
}
}
double totalEnglishAvg = (double)totalEnglishSum/totalStudent;
System.out.println("전체 학생의 영어 전체 점수: " + totalEnglishSum);
System.out.println("전체 학생의 영어 평균 점수: " + totalEnglishAvg);
System.out.println();
}
}
결과:
mathScores[0][0]: 0
mathScores[0][1]: 0
mathScores[0][2]: 0
mathScores[1][0]: 0
mathScores[1][1]: 0
mathScores[1][2]: 0
전체 학생의 수학 전체 점수: 516
전체 학생의 수학 평균 점수: 86.0
mathScores[0][0]: 0
mathScores[0][1]: 0
mathScores[1][0]: 0
mathScores[1][1]: 0
mathScores[1][2]: 0
전체 학생의 영어 전체 점수: 460
전체 학생의 영어 평균 점수: 92.0
문제입니다.
1.
3행 3열 짜리 문자열 배열을 선언
(0,0)(0,1)(0,2)
(1,0)(1,1)(1,2)
(2,0)(2,1)(2,2)
2.
4행 4열짜리 정수형 배열 선언
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
3.
4행 4열짜리 정수형 배열 선언
16 15 14 13
12 11 10 9
8 7 6 5
4 3 2 1
4.
4행 4열 2차원 배열을 생성하여 0,0 부터 2,2 까지는 1~10 까지의 임의의 정수 값을 저장하여
아래와 같이 처리하세요.
값 값 값 0행 값들의 합
값 값 값 1행 값들의 합
값 값 값 2행 값들의 합
0열 값들의 합 1열 값들의 합 2열 값들의 합
출력 :
9 3 7 19
3 6 9 18
6 10 10 26
18 19 26 63
public class referance {
public static void main(String[] args) {
System.out.println("1.");
String[][] str = new String[3][3];
for(int i=0; i<str.length; i++) {
for(int j=0; j<str[i].length; j++) {
System.out.print("(" + i +","+ j + ")");
}
System.out.println();
}
System.out.println("----------------------");
System.out.println("2.");
int[][] array1 = new int[4][4];
int n = 1;
for(int i=0; i<array1.length; i++) {
for(int j=0; j<array1[i].length; j++) {
array1[i][j] = n;
n++;
System.out.print(array1[i][j] + " ");
}
System.out.println();
}
System.out.println("----------------------");
System.out.println("3.");
int[][] array2 = new int[4][4];
int a = 1;
for(int i=0; i<array2.length; i++) {
for(int j=0; j<array2[i].length; j++) {
array2[i][j] = a;
a++;
}
// System.out.println(); 배열생성을 위한 for문 으로 print 할필요 없습니다.
}
for(int i=array2.length-1; i>=0; i--) {
for(int j=array2.length-1; j>=0; j--) {
System.out.print(array2[i][j] + " ");
}
System.out.println();
}
System.out.println("----------------------");
System.out.println("4.");
int[][] ar4 = new int[4][4];
for(int i=0; i<ar4.length-1;i++) {
for(int j=0; j<ar4[i].length-1; j++) {
ar4[i][j] = (int)(Math.random()*10+1);
ar4[i][3] += ar4[i][j]; //[0,3],[1,3],[2,3]
ar4[3][j] += ar4[i][j];
ar4[3][3] += ar4[i][j];
}
}
for(int i=0; i<ar4.length;i++) {
for(int j=0; j<ar4.length;j++) {
System.out.print(ar4[i][j] + "\t");
}
System.out.println();
}
}
}
결과:
1.
(0,0)(0,1)(0,2)
(1,0)(1,1)(1,2)
(2,0)(2,1)(2,2)
----------------------
2.
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
----------------------
3.
16 15 14 13
12 11 10 9
8 7 6 5
4 3 2 1
----------------------
4.
2 3 1 6
2 7 4 13
9 3 6 18
13 13 11 37
'JAVA > Java 기초' 카테고리의 다른 글
| 참조-배열 등등...java (0) | 2023.01.10 |
|---|---|
| 배열 응용문제 (0) | 2023.01.09 |
| 반복문(for, while, do-while) (0) | 2023.01.06 |
| 연산자-2.java (0) | 2023.01.05 |
| 연산자-1.java (0) | 2023.01.05 |