본문 바로가기
자바과정/Java

Java 기초 - 3일차

by Parkej 2021. 2. 1.
public class ObjectArrayExam04 {

	public static void main(String[] args) {

		//객체 배열
		// 객체 타입은 레퍼런스 변수를 통해 접근해야함. 
		String []str = new String[3]; // 객체를 만들지 않음. 객체당 1개
		
		str[0] = new String("Superman"); // 소괄호를 써야 객체가 생성된다고 할 수 있음.
		str[1] = new String("Batman");
		str[2] = new String("pororo");
		
		String [][]str2 = new String[2][2]; // 객체를 만들 수 있는 환경만 만든것.
		
		
		
		String s = new String("superman");
		// 1차원 배열 레퍼런스 필요
		
		// 레퍼런스에 레퍼런스가 하나씩 추가됨 2차원 :3번 3차원 :4번(레퍼런스 * 4)
		// 객체타입은 레퍼런스를 가지고 있음 배열을 쓴다는 얘기는 레퍼런스를 추가하는거임. 
	}

}

복습
 스택 LIFO 지역변수
 힙 큐 FIFO 동적메모리 (레퍼런스타입들)

 배열 : array (같은 타입을 붙혀서 메모리를 효율적으로 관리할 수 있는 공간)
- 레퍼런스 타입 (배열, 객체) 2개를 쓸때
- 동적메모리를 쓰기때문에 힙이랑 스택을 사용함
(c는 메모리/자바는 객체단위)


- 객체를 배열로 만드는게아니라
- 객체를 배열로 쓰게하기 위해 배열을 레퍼런스로 만드는거임
- 동일한 데이터타입을 메모리상에 순차적으로 확보. (비동일 x)

int a,b,c; // 스택에 잡힘 (지역변수)


배열 접근
arr[0] // 0번은 상대적 거리를 의미함.


[위치만 알면 됨.]번지수 (아래가 배열 : 같은 타입이 메모리상에 순차적으로 나열됨.)
a    c    d
100 104 108
(4byte 씩 건너뛰면서 사용가능)
 - 반복문을써서 사용

b
300

배열의 장점 : 
 - 일괄처리
배열의 단점 : 
 - 메모리 추가, 삭제가 힘들다.

입력하는 크기보다 1.5배 할당

선언
DataType []레퍼런스이름; // int []arr;
arr = new int[ 3 ]; // int 배열 접근 - 크기는 정해줘야함

 

// java.lang.ArrayIndexOutOfBoundsException (오버플로우 에러에대해)

 - 자바는 실행하면서 오류가 발생하면 알려줌(결과를 출력하면서...)

 * 보통 출력하려는 배열의 크기를 벗어났을 시 발생한다. 해결법은 선언한 배열의 크기와 출력하려는 인덱스의 크기가 같은지 확인해서 수정해 주면 끝난다. 

 * 배열이름.length를 써도 됨.

 

 

강의 코드

public class array {
	public static void main(String []args) {
		int []arr; // 배열을 접근하는 레퍼런스 변수 선언
		arr = new int[3]; // int 5개짜리 배열
		
//		arr[0] = 1;
//		arr[1] = 2;
//		arr[2] = 3;
	
//		System.out.println(arr[0]);
//		System.out.println(arr[1]);
//		System.out.println(arr[2]);


		for(int i=0;i<arr.length;i++)
		{
			arr[i] = i+1;
		}
		for(int i=0;i<arr.length;i++)
		{
			System.out.println(arr[i]);
		}
		
        /*
		for(int i=0;i<3;i++)
		{
			arr[i] = i+1;
		}
		for(int i=0;i<4;i++) {
			System.out.println(arr[i]);
			// java.lang.ArrayIndexOutOfBoundsException (인덱스 오버플로우 에러)
            // 2번째 for문의 i의 값을 선언 배열의 인덱스 크기와 맞춰준다. (3으로 수정해야 오류해결)
		}
        */
	}
    
}

 

     형변환
1. 자동형변환 (자동으로 바꿔줌) : 서로 다른 타입을 연산할 때 발생
 - 작은 타입이 큰 타입으로 바뀌어서 연산

3 + 4
3 + 4.1 (int + double) > 자동형변환 int를 double로 -> 3.0 + 4.1 = 7.1
 - 컴퓨터는 같은 타입끼리 연산됨
 
2. 강제형변환 : 같은 타입을 연산할때 개발자가 필요에 의해 처리

3/4 = 0.75 (0.아래는 절삭)
결과는 0 (int/int = int)

 int a = 3;
 int b = 4;
a/b; (int/int)
(double)a/(double)b; // 연산하는 순간만 강제형변환됨
3.0/4.0 

 

 

 

****자바 메모리와 c 메모리구조는 다름

다차원배열

- 1차원 [요소의 개수]
- 2차원 [행의 개수][열의 개수]
 int [][] arr2;
 arr2 = new int[2][2]; //메모리 잡기 new(동적 메모리)
 실제로는 1차원만 잡히게 됨.
 1행에 2개씩 붙어있어서 만들어짐

- 3차원 [면의 개수][행][열]

//  java.lang.NullPointerException (메모리 접근불가)

* NPE은 NULL값 (자바 기초 1일차에 설명)

 

 

강의 코드

public class ArrayExam02 {
	public static void main(String []args) {
		
		// 1차원
		int [][]arr2 = new int[2][2]; 
		
		// heap 동적 영역에 잡히는 것들은 자동으로 0으로 초기화됨.
		// 지역변수는 값을 항상 쓰레기값을 가져옴(stack)
		
		for(int i=0;i<2;i++) {  // 행
			for(int j=0;j<2;j++) {  // 열
				System.out.println(arr2[i][j]);
			}
		}
		
		// 2차원
		int [][]arr3 = new int[2][]; //자바는 동적 메모리를 할당할때 크기를 안줘도 됨.
		
		arr3[0] = new int[3]; // 0행은 3개
		arr3[1] = new int[2]; // 1행은 2개
		
		for(int i=0;i<2;i++) {  // 행
			for(int j=0;j<2;j++) {  // 열
				System.out.println(arr3[i][j]);
			}
		}
		
		for(int i=0;i<arr3.length;i++) {  // 행
			for(int j=0;j<arr3[i].length;j++) {  // 열
				System.out.println(arr3[i][j]);
				
				// 행을 통해서 접근해야함
			}
		}
		
		// 3차원
		int [][][]arr3 = new int[2][2][3];
		for(int i=0;i<arr3.length;i++) {
			for (int j=0;j<arr3[i].length;j++) {
				for(int k=0;k<arr3[i][j].length;k++) {
					System.out.print(arr3[i][j][k]);
				}
				System.out.println();
			}
		}
	}
}

1차원과 2차원
2차원 배열의 원소접근
3차원 배열의 구조
arr3[2][2][2] 구조

 

 

for each문

public class ArrayExam03 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// for each
		
		int []arr = new int[5];
		
		//정통적
		for(int i=0;i<arr.length;i++) {
			System.out.println(arr[i]);
			
		}
		System.out.println("=====================");
		// jdk 5.0이후 나옴
		// for each문
		
		for(int data:arr) {
			System.out.println(data);
		}
		
		// 객체타입의 배열 ??? 
	}

}

 

 

String 에 대하여

public class Stringc {

	public static void main(String[] args) {
		
		String str1 = new String("Superman");
		String str2 = new String("Superman");
		
		if(str1 == str2) { // String 비교는 '=='가 안됨.
			// 변수가 참조하고 있는 주소값을 비교하는것임. (위치비교)
			System.out.println("Same");
		}
		else {
			System.out.println("Diff");
		}
		/////////// 주소값과 값 비교
		if(str1.equals(str2)) { // 문자열에서 이퀄스는 문자열안의 '값을 비교함.'
			System.out.println("Same");
		}
		else {
			System.out.println("Diff");
		}
		
		// 명시적으로 쓴것과 안쓴것의 차이점 'new에 대해서 다시 알아보기'
//		String str3 = new String("Batman"); 
		String str3 = "Batman"; //str3 == str4 를 했을떄 same이 나옴
		String str4 = "Batman";
	
		if(str3 == str4) { // String 비교는 '=='가 안됨.
			// 변수가 참조하고 있는 주소값을 비교하는것임. (위치비교)
			System.out.println("Same");
		}
		else {
			System.out.println("Diff");
		}
		///////////
		if(str3.equals(str4)) { // 문자열에서 이퀄스는 문자열안의 '값을 비교함.'
			System.out.println("Same");
		}
		else {
			System.out.println("Diff");
		}
		
		System.out.println(str3);

		str3 = "pororo"; // 데이터가 바뀌는게 아니라 객체가 바뀌는것.
		
		System.out.println(str4);
		System.out.println(str3);
		
		// str3를 pororo로 가르켜라
		// string은 데이터를 못바꿈 다시 할당해야함. (객체를 통체로 바꾼다.)
	}

}


/* 
 * String class api( 문자열 담당 ) 
 * 
 * 객체 타입은 레퍼런스 타입 (동적 메모리 할당해야함)
 * 동적 ㅁ모리를 할당하지 않고 바로 쓸 수 있는것은 static (메모리생성)
 * 
 * 기본타입 int a = 1;
 * 
 * String str = new String("Superman"); 슈퍼맨이라는 문자열을 가지고 있는 객체를 만듦
 * String str = "Superman";
 * 
 */

 

객체타입 배열

public class ObjectArrayExam04 {

	public static void main(String[] args) {

		//객체 배열
		// 객체 타입은 레퍼런스 변수를 통해 접근해야함. 
		String []str = new String[3]; // 객체를 만들지 않음. 객체당 1개
		
		str[0] = new String("Superman"); // 소괄호를 써야 객체가 생성된다고 할 수 있음.
		str[1] = new String("Batman");
		str[2] = new String("pororo");
		
		String [][]str2 = new String[2][2]; // 객체를 만들 수 있는 환경만 만든것.
		
		
		
		String s = new String("superman");
		// 1차원 배열 레퍼런스 필요
		
		// 레퍼런스에 레퍼런스가 하나씩 추가됨 2차원 :3번 3차원 :4번(레퍼런스 * 4)
		// 객체타입은 레퍼런스를 가지고 있음 배열을 쓴다는 얘기는 레퍼런스를 추가하는거임. 
	}

}

 

- 이미지 설명

 str[0] = new String("Superman"); 
 str[1] = new String("Batman");
 str[2] = new String("pororo");

 

 

String [][]str2 = new String[2][2];

 

 

-   메소드와 함수
* 메소드를 나눈다 (모듈화 )
method : 자기자신의 특정기능을 수행
사용자정의 method

1. instance method
2. static method

모듈화
1. call by name // 이름 호출, 유지보수가 쉬움
 - 기능적으론 확장성이 떨어짐 
2. call by value // 값을 알려줌 
3. call by reference // 특정 위치를 알려줌 위치에 해당되는 메모리를 사용함. (배열 오브젝트) 
 - 가장 많이씀.

* 결합도는 최소화 응집도는 최대화

 

 

배열

반응형

댓글