[LG 유레카] 변수, 배열
리뷰
[할 수 있어?]
- MethodCallTest라는 자바클래스를 만드시오.
- “안녕, 유플러스^o^”를 콘솔화면에 출력하시오.
- A클래스를 만들고 내부에 hello() 메서드를 만드시오.
- main()에서 hello()메서드를 호출하시오
- MethodCallTest에 good()메서드를 만들고 main()에서 호출하시오.
Cannot make a static reference to the non-static method good() from the type MethodCallTest
-
static 메서드란?
객체 생성 없이 호출 가능한 메서드
같은 패키지 안에 같은 이름의 class를 생성할 수 없습니다.
그렇지만 클래스 안에 내부 클래스의 이름은 중복이 가능합니다.
속성변수
-
속성 변수란?
데이터 값(value)을 담는 변수
-
자료형 변수명; 의 형태를 가집니다.
- 여기서 자료형은 byte, short, int, long, float, double, char, boolean
int no;
: no에 정수를 담겠다!no=300;
➡ 자료형이 int이고 변수명이 no인 변수에 300을 담음.System.out.println(no); //300 System.out.println(no + 200); //500 System.out.println(no.); //에러 발생
-
참조변수
-
참조변수란?
데이터 주소(address)를 담는 변수
-
자료형 변수명; 의 형태를 띕니다.
- String, Integer, A, NameMenu, Person 등
class A{ int su=100; void hello(){ ... } } //A a; => a에 주소를 담겠다. A a = new A(); System.out.println(a.su); System.out.println(a.hello());
-
데이터 저장 유형
만약 정수 100을 데이터 저장을 한다고 가정하면 다양한 곳에 저장이 가능합니다.
-
변수
int su = 100; System.out.println(su);
-
배열
int [] su = {100}; System.out.println(su[0]);
-
클래스
class A{ int su=100; } A a = new A(); System.out.println(a.su); --------------------------- class A{ private int su=100; public void setSu(int su){ this.su=su; } public int getSu(){ return su; } } A a= new A(); System.out.println(a.getSu());
값 복사
int su1;
int su2;
su1 = 100; //su1: 100
su2 = su1; //su1:100 su2:100
su1 = su1*200; //su1:20000 su2:100
주소 복사Ⅰ
A a1;
A a2;
a1 = new A();//객체생성식
a1.su = 100; //a1.su:100
a2.=a1 //a1.su:100 a2.su:100
a1.su=a1.su*200 //a1.su:20000 a2.su:20000
a2.=a1
은 값을 삽입하는 것이 아니라 값에 접근할 수 있는 주소를 공유하는 것
주소복사Ⅱ
A a1;
A a2;
a1 = new A();
a1.su = 100; //a1.su:100
a2 = new A();
a2.su = 100; //a1.su: 100 a2.su:100
a1.su=a1.su*200 //a1.su: 20000 a2.su: 100
이 경우 객체를 각각 생성해 주어서 주소 공유가 아니라 각각의 주소가 존재한다.
배열
배열이란?
-
자료형이 동일한 데이터들에 같은(한개의) 변수명을 정의한 자료들의 집합
- 자료형이 동일한 데이터들 => 조건
- 같은(한개의) 변수명을 정의 =>특성
- 자료들의 집합 => 정의
int su1;
: 한 개의 정수를 저장할 준비int [] su2;
: 여러개의 정수를 저장할 준비 -
데이터 관리가 편하다.
-
여러 개의 데이터를 변수명 한 개를 사용해 전달
배열인덱스 사용 ➡ for문 사용: 전체 데이터를 검색
-
-
서로 데이터들을 구분하기 위해 번지를 사용한다.
-
시작 번지는 0번지, 1씩 증가하는 번지를 가진다.
-
배열의 크기가 정해지면 인덱스를 벗어나는 참조를 하면 안된다.
int [] su3 = {10,20,30};
인덱스=> su3[0], su3[1], su3[2]
배열의 크기(요소 갯수): 3
System.out.println(su3[1]);//데이터 사용 (두번째데이터 출력) System.out.println(su3[3]); ===> 에러발생: ArrayIndexOutOfBoundsException!!
int su1 = 11;
int su2 =22;
int su3 = 33;
➡ int [] su ={11, 22, 33};
각각 하나에 저장하는 방법 말고도 이렇게 배열을 사용해서 저장해 놓고 사용 가능!
데이터를 구분하기 위해서 배열을 사용한다면 su라는 배열변수에 복수 데이터를 대입하면 된다.
int su; ➡ 한 개의 데이터 입력
int [] su; ➡ 여러 개의 데이터 입력(배열)
boolean [] b = {true , false , true};
String [] str = { “길동” , “라임” , “주원” };
char []ch ={ ‘j’ , ‘a’, ‘v’, ‘a’}[5000 데이터 출력]
System.out.println(5000); //int int su = 5000; System.out.println(su); //배열 int [] suArr = {5000}; System.out.println(suArr[0]);
-
배열의 크기
(배열의 요소 갯수)
를 구하는 속성배열명. length
배열은 객체이다.
-
배열 선언 시 []는 변수명 앞에 또는 뒤에 붙여도 상관없다.
- int [ ] su; = int [ ] su;
-
기본 자료형을 선언 할 때,
int i;
,int j;
,int k;
와int i,j,k;
은 같다. 그렇다면 배열과 어떤 차이가 있을까?차이점
int su1 [],su2;
➡su1은 배열, su2는 int 변수
int [] su1,su2
➡su1, su2 둘 다 int 배열
class A{ int i; //기본값 존재O(값을 넣지 않더라도 클래스 안에 선언된 멤버변수는 기본값이 존재합니다.) void hello(){ int j; //기본값 존재X(메소드 내에 선언된 지역변수, 메소드가 종료되면 자동 소멸됩니다.) System.out.println(i); //출력? 0 System.out.println(j); //출력? (초기화하지 않았다는)에러발생 j=0; System.out.println(j); //출력? 0 int a,b,c=0; System.out.println(c); //출력? 0 System.out.println(a); //출력? (초기화하지 않았다는)에러발생 System.out.println(b); //출력? (초기화하지 않았다는)에러발생 ==> int a=0,b=0,c=0; //각각 초기화 System.out.println(c); //출력? 0 System.out.println(a); //출력? 0 System.out.println(b); //출력? 0 }//hello }
배열 형식
-
자료형 [ ] 배열명 = {데이터 List(콤마로 구분되는 데이터)};
-
배열 선언과 동시에 데이터를 초기화 ➡ 이미 데이터가 확정되었을 때 사용
※주의: 배열선언과 데이터 초기화하는 부분을 따로 작성할 수 없음!!
int [] su;//배열선언 su = {1,2,3,4,5}; //배열초기화 (X) int []su = {1,2,3,4,5}; //선언과 초기화 (O) A a = new A(); A []su2 = { a, new A(), new A() };
배열은 배열 객체이다. 클래스와 동일하다고 생각하면 된다.
-
-
자료형[] 배열명 = new 자료형[배열크기]; ➡ ⭐배열 객체 생석식⭐
- 프로그램 실행 도중 데이터 값을 입력할 때(변경 할 때) 주로 사용
- 데이터가 정해지지 않고 앞으로 입력받을 데이터들이 저장될 방(공간)만 준비
- 배열 선언과 데이터 초기화하는 부분을 따로 작성하는 것이 가능
- 배열 크기[]는 반드시 자료형 뒤에 위치해야 함
- 배열 크기에 정수값이 반드시 입력되어야함
int [] su; //배열 선언
su = new int[5];
//데이터 입력
su[0]=11;
su[1]=22;
su[2]=33;
su[3]=44;
su[4]=55;
su[5]=66; //인덱스를 벗어났으므로 에러발생
※배열 객체생성(위의 2번)을 하게 되면 그 위치에 상관없이 각방에는 초기값이 부여됨.
멤버변수 처럼 각 자료형의 기본값이 입력됨
2차원 배열
실제 저장은 1차원 배열과 같으나 논리적으로 데이터를 행과 열의 형태로 저장한다고 표현
-
열 사이즈는 생략하는 것이 가능하나 행 사이즈는 반드시 기술해야 한다.
int [][] su; int su [][]; int []su[];
0 열 1열 2열 0행 1 2 3 1행 4 5 6 System.out.println(su[0][2]); //0행2열 데이터 ==> 3 System.our.println(su[1][1]); //1행1열 데이터 ==> 5 su.length //행의 갯수:2 su[0].length //0행의 열의 갯수:3 su[1].length //1행의 열의 갯수:3 for(int i=0; i<su.length; i++){ for(int j=0; j<su[i].length; j++){ System.out.println(su[i][j]); //su배열 i행 j열 } }
배열 연습문제
int [] su ={1,2,3,4,5};
문제1)
위 배열의 데이터를 차례대로 출력하시오.
문제 2)
위 배열의 데이터를 역순으로 출력하시오. (4번지~0번지)
문제3)
int su2[][]={ {1}, {1,2}, {1,2,3}}; su2배열의 데이터를 번지값과 함께 출력하시오. —> 예) su2[0][0]번지 = 1 행 열
문제4)
su3 이라는 배열을 새롭게 만들어서 [예시]su배열의 값을 복사하시오.
su3 = su; (X)
su3[2]=33;
System.out.println(su[2]); // 3 출력
문제5)
[예시]su배열을
—-> for문을 통해 [0]번지~[4]번지까지 출력을 했을때
5 4 3 2 1 과 같이 출력되도록 하시오.
—-> [0]번지와 [4]번지 데이터 교환
[1]번지와 [3]번지 데이터 교환 후 출력!!
문제6)
su배열의 홀수번지를 출력하시오. su[1] su[3] su[5] su[7]…… 2 4 65
문제7)
su배열의 홀수값을 출력하시오. 1 3 5 7 65
문제8)
입력값
0 1 0 0 1
1 3 5
==> 8개의 정수데이터가 두줄에 입력된다.
이 입력된 값을 arr[ ]배열에 저장하자.
예외
-
예외(Exception)란?
프로그램 실행 중 발생하는 예기치 않은 사건을 말한다.
-
예외 발생 시 어떤 처리(대응)를 할지 추가 코드 작성
➡ 예외처리: 자바언어를 더욱 강하게 만드는 요소로 개발자 입장에서는 코드량이 증가하지만 사용자 입장에서는 신뢰성있는 프로그램이 된다.
void hello() throws Exception{ //throws Exception으로 예외처리 전가 문장1; 문장2; 문장3; }
이렇게 hello() 메소드를 예외처리 전가를 시키면 hello() 메소드를 호출하는 메소드에서 예외처리 하도록전가하는 것이다.
-
예외처리 구문Ⅰ
-
try~catch문
void hello(){ try{ 문장1;//AException 발생 가능 문장2; 문장3;//BException 발생 가능 }catch(AException){ //AException 발생 시 실행문장; }catch(BException){ //BException 발생 시 실행문장; } }
예외처리 구문Ⅱ
-
finally 블럭
void hello(){ try{ 문장1; 문장2;//AException 발생 가능 문장3; 문장4;//BException 발생 가능 }catch(AException){ 문장6; }catch(BException){ 문장7; }finally{ 문장5; } }
-
정상 실행(예외발생 안함)
➡1; 2; 3; 4; 5;
-
AException 발생
➡1; 6; 5;
-
BException 발생
➡1; 2; 3; 7; 5;
즉, finally블럭을 사용하면 반드시 실행한다.
-
예외 종류
-
체크(Checked)예외
public static void main(String[] args){ System.in.read(); //에러: Unhandled exception type IOException }
- 컴파일 에러 발생
- 명시적으로 발생할 수 있는 예외에 대한 처리를 강요
- 반드시 try~catch 또는 throws를 사용해야함
-
언체크(UnChecked)예외
public static void main(String[] args){ String [] name = {"길동", "주원"}; System.out.println(names[3]); //배열의 인덱스를 넘어서 에러 발생 }
- 개발자 실수 또는 사용자 입력데이터 예외
- 컴파일시 에러가 발생하지 않는다.
- RuntimeException을 상속받는 예외
- try~catch 또는 throws 사용 가능
- if문을 통해 처리가능
더하기
import
현 클래스와 동일한 패키지에 있는 클래스 또는 기본 패키지에 있는 클래스는 바로 사용 가능
java.lang
➡ 기본 패키지
이외의 클래스는 import가 필요
- import는 클래스 위치를 표현하는 방법
개선된 for문(forEach문)
for문을 활용할 때, 인덱스는 필요 없고 오로지 데이터만 필요할 때 사용한다.
for(자료형 변수명 : 배열명){
}
int [] su = {1, 2, 3, 4, 5};
for(int data: su){
System.out.print(data);
}
=> 12345
복사
-
얕은 복사
int [] su = {1, 2, 3, 4, 5}; int [] su3; su3 = su;
배열의 주소를 복사해서 동일한 메모리를 su3과 su가 참조한다.
-
깊은 복사
다른 메모리를 할당, 배열 각가의 번지내의 데이터를 복사
int [] su = {1, 2, 3, 4, 5}; int [] su3; for(int i=0; i<su.length; i++) { su3[i]=su[i]; }
-
Object.clone()
int [] su = {1, 2, 3, 4, 5}; int [] su3 = su.clone(); for(int i=0; i<su.length; i++) { System.out.print(su3[i]); } => 12345
-
System.arraycopy()
➡ 속도가 빠르다
System.arraycopy(원본배열, 원본 배열의 복사 시작 지점, 복사할 배열, 복사할 배열의 복사 시작 지점, 복사할 요소의 개수)
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
int [] su = {1, 2, 3, 4, 5}; int [] su3 = new int [su.length]; System.arraycopy(su, 0, su3, 0, su.length); for(int i=0; i<su.length; i++) { System.out.print(su3[i]); }
-
Arrays.copyOf()
Arrays.copyOf(원본배열, 원본 배열에서 복사해올 길이)
Arrays.copyOf(Object src, 원본 배열에서 복사해올 길이)
int [] su = {1, 2, 3, 4, 5}; int [] su3 = Arrays.copyOf(su, su.length); for(int i=0; i<su.length; i++) { System.out.print(su3[i]); }
-
Arrays.copyOfRange()
Arrays.copyOfRange(배열original, 시작인덱스from, 복사할 길이to)
int [] su = {1, 2, 3, 4, 5}; int [] su3 = Arrays.copyOfRange(su, 0, su.length); for(int i=0; i<su.length; i++) { System.out.print(su3[i]); }
-
toString()
배열의 값만 for문을 사용하지 않고 쉽게 출력할 수 있다.
➡ java.util.Arrays.toString(배열);
System.out.println(Arrays.toString(su3));
toString을 사용하지 않고 배열을 그냥 출력하면 데이터가 아니라 주소 값이 출력된다.
swap
int a = 10과 int b=20이 있는데, int a에 b의 값을 넣고 b에는 a의 값을 넣으려면 어떻게 해야할까?
int a = 10;
int b = 20;
int temp;
temp = a;
a = b;
b = temp;
System.out.println(a);
System.out.println(b);
위와 같이 값을 잠시 다른곳에 담아두고 다시 넣어주면 된다.
배열의 연습문제 5번)
su 배열의 [0]번지와 [4]번지 데이터, [1]번지와 [3]번지 데이터 교환 후 출력!!
int [] su = {1, 2, 3, 4, 5};
int half = su.length/2; //교환하는 인덱스 수를 보면 가운데를 기준으로 교환이 두번 이루어짐
int temp;
for(int i=0,j=su.length-1; i<half; i++,j--){//i=0. j=4 > i=1, j=3
temp = su[i];
su[i] = su[j];
su[j] = temp;
}
System.out.print(Arrays.toString(su));
입출력 4대 클래스
스트림(Stream) - 연속된 바이트의 흐름
읽기 | 쓰기 | |
---|---|---|
InputStream | OutputStream | ⬅ 바이트 단위 |
Readr | Writer | ⬅문자단위 |
읽기 대표 메서드 : read()
쓰기 대표 메서드: write()
구분자
구분자로 입력받은 문자열을 나눌 수 있다.
-
split()
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); //0 1 0 0 1입력 // str="0 1 0 0 1" String [] strArr = str.split(" "); //strArr = {"0", "1", "0", "0", "1"}
[문자열을 정수로 변환]
int[]arr=new int[strArr.length]; //정수 데이터들을 담을 빈 배열 생성 for(int i=0; i<strArr.length; i++){ arr[i] = Integer.parseInt(strArr[i]); }//arr = {0, 1, 0, 0, 1}; System.out.println(Arrays.toString(arr)); => [0, 1, 0, 0, 1]
-
StringTokenizer
StringTokenizer tokens = new StringTokenizer(나눌 문자열, 기준문자열str);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); //0 1 0 0 1입력 // str="0 1 0 0 1" StringTokenizer tokens = new StringTokenizer(str, " "); //구분자를 통해 구분된 각각의 데이터를 '토큰'이라고 표현
[문자열을 정수로 변환]
int[]arr=new int[5]; //정수 데이터들을 담을 빈 배열 생성 for(int i=0; i<5; i++){ arr[i] = Integer.parseInt(tokens.nextToken()); System.out.println(Arrays.toString(arr)); }//arr={0, 1, 0, 0, 1} System.out.println(Arrays.toString(arr)); => [0, 1, 0, 0, 1] ========================================================== while(tokens.hasMoreTokens()) { System.out.print(tokens.nextToken()); }
댓글남기기