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();
}
}
}
}
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");
- 메소드와 함수
* 메소드를 나눈다 (모듈화 )
method : 자기자신의 특정기능을 수행
사용자정의 method
1. instance method
2. static method
모듈화
1. call by name // 이름 호출, 유지보수가 쉬움
- 기능적으론 확장성이 떨어짐
2. call by value // 값을 알려줌
3. call by reference // 특정 위치를 알려줌 위치에 해당되는 메모리를 사용함. (배열 오브젝트)
- 가장 많이씀.
* 결합도는 최소화 응집도는 최대화
'자바과정 > Java' 카테고리의 다른 글
Java 실습(성적처리프로그램:배열) - 3일차 (0) | 2021.02.01 |
---|---|
Java 실습(성적처리프로그램) - 3일차 (0) | 2021.02.01 |
Java 기초 - 2일차(추가 및 보완) (0) | 2021.01.30 |
Java 기초 - 2일차 (0) | 2021.01.29 |
Java 실습(사칙연산 반복계산) - 2일차 (0) | 2021.01.29 |
댓글