Java

자바 참조타입 / 배열 /

lily_y 2023. 10. 3. 18:52

 

 

  • 메모리의 번지를 값으로 지정
  • 기본타입(스택영역에 이름과 값이 함께 저장)과 다르게 힙영역(주방의 조리대역할)에 저장된 메모리 주소를 참조받음

메소드(클래스/static) 영역 : (static) , 로딩된 클래스 바이트 코드 내용을 분석 후 저장 / 모든 스레드가 공유

힙 영역 : 객체 / 배열 저장 , JVM이 사용하지 않는 객체를 G.C를 실행시켜 자동 삭제해주는 영역

 


배열 생성

 

new 연산자

값의 목록을 가지고 있지 않지만, 향후 값들을 저장할 배열을 미리 만들고 싶을때

타입[] 변수 = new 타입[길이];

intArray : 스택영역으로 , 저장될 수 있는 공간을 확보하는

String[] names = new String[10]; : String배열을 생성했다면 name 0~9까지 모두 null값으로 초기화된다.

 

배열 길이

배열변수.lenght;

int num1 = Integer.parselnt(strNum1 ); : 문자열을 정수로 변환

 

인덱스

  • 각 요소에 자동으로 붙는 번호
  • int[] score = new int[5];
    • score의 길이는 5이지만 인덱스는 0 ~ 4까지이다

 

== . !=

  • 기본타입 : 변수의 값이 같은지 다른지 조사
  • 참조타입 : 동일한 객체를 참조하는지 다른 객체를 참조하는지 조사 ( 동일한 주소값을 갖는지)

 

.equals

값이 같은지 비교 (주소가 아닌)

문자열을 비교할 때 사용

 

NullPointerException : 예외

참조 변수가 null값을 가지고 있을 때

null인 변수에 값을 지정했을때

null인 변수를 지정할때

 

String 타입 : 문자열

문자열을 저장하는 클래스 타입

  • 하나씩 저장 ___String name; name = “ 신용권”;
  • 동시에 저장 ___ String name2 = “신용권”;
  • ⇒ 문자열 리터럴이 동일하다면 하나의 힙 영역에 저장됨
  • 바로 대입이 아닌, new 연산자 이용
    • new라는 연산자가 힙이라는 하나의 영역을 갖게한다.
    • 문자열 리터럴이 동일하더라도 new라는 연산자를 이용하면 각각의 힙 영역에 저장할 수 있다.
    • 비교 연산자의 값이 달라질 수 있으니 주의
  • String타입에 null; 대입할 수 있따.
    • null을 대입하면 더이상 참조하지 않는다.

배열 타입 [ ]

똑같은 타입의 값을 한 곳에 모아놓고 저장하고 작업하는 자료구조

여러개의 데이터들의 저장 위치를 인덱스 부여해 접근

  • 변수 선언과 동시에 값 목록 대입 : 인덱스와 접근 “ 변수 [인덱스주소] : “ + 변수[0]);
  • 변수 선언 후 값 목록 대입
  • new 연산자로 배열 생성 ,
  • 공간만 만들어 놓을시 int 값이 기본값

 

배열 복사

  • for문으로 복사 (이미 만들어진 클래스 = 대입 )
  • System.arraycopy ( 변수, 몇번째부터, 어떤배열에다가 , 몇번째인덱스부터, 몇개를 카피할것인가);

 

향상된 for문 __(변수 : 메소드)

  • 배열 및 컬렉션의 항목 요소를 순차적으로 처리
  • 인덱스 이용하지 않고 바로 반복

                       (배열이 가진 모든 값만큼 반복하고 싶을 때 사용)

 

열거 타입__(한정된)

상수를 묶어놓고 쓸때 사용 (실무에선잘 사용은 안함)

 

import

import java. until* :

 

import 패키지명.클래스명;

import 패키지명.*; -> 모든 클래스

import문은 패키지문과 클래스 선언의 사이에 선언한다.

  1. 패키지 선언 2. import문 3. 클래스 정의

  • 참조타입은 null값으로 초기화 할 수 있다
  • 클래스 변수에 만들어지는 블록
  • 메소드 변수에 만들어지는 블록 = 로컬변수

스택영역에 생성되고 실행 블록이 끝나면 소멸됨

  • 배열 객체 = 힙 에 저장
  • 변수 = 메소드 “
  • String타입의 메모리 주소값 비교는 ==
  • 불린타입의 초기값은 false임
  • 나눗셈 avg = (double (sum) / count

 

 

 

 

 

 

 

 

배열을 이용한 예제풀이




Scanner scn = new Scanner(System.in);

int i, cnt = 0; ___ while문의 초기식 (for문도 초기식 사용)

cnt ++; ___ 증감해라

 

5개의 정수를 입력받아

int[] arr = new int[5];

int i;

 

차례로 출력해라

arr [i] = scn.nextlnt();

System.out.print(arr[i] +” “);

 

문자 5개를 저장할 수 있는 배열을 선언

char[] arr = new char[10];

int i;

 

문자를 이어서 출력해라

arr [i] = scn.next().charAt(0);

System.out.print(arr[i]);

 

세번째, 다섯번째와 마지막으로 입력받은 정수를 차례로 출력

System.out.print(arr[2] + “ “ + arr[4] + “ “ + arr[arr.lenght - 1);

인덱스번지는 0부터 시작하니 2 , 4 그리고 arr의 길이에서 -1을 빼주면 마지막 글자가 됨

 

짝수번수에서

for ( i=1; i<cnt; i+=2)

 

가장 나중에 입력된 정수부터 차례대로 출력

for (i=cnt-1; i≥0; i—)f

 

for문에서의 0 이 되면 빠져나와라

if ( arr[i] == 0)

break;

 

100개의 정수를 저장할 수 있는 배열선언

int[] arr = new int [100];

0이 입력되면 0을 제외하고

if ( arr[i] == 0)

break;

cnt ++; ( 이건 증감하라는 거)

 

해당 월의 날수를 출력 ( 2월 28일 / 4,6,9,11월은 30일 / 나머지는 31일 ..)

if( i==2) { day[i] = 28; } else if( i==4 || i==6 || i==9 || i==11) { day[i] = 30; } else { day[i] = 31; }

 

while을 이용한 0이 되면 종료

while(true)

if (i ==0)

break;

 

홀수중 가장 큰 값

if (n[i]%2!=0)

n[i] 를 2로 나눈 나머지가 0이 아닐때

if (n[i] < min)

(평균은 소수 첫째자리까지 출력)

 

오름차순으로 정렬하는 프로그램

if(n[i]>n[j]) { tmp = n[i]; n[i] = n[j]; n[j] = tmp;

비교를 하며 자리를 바꾸면서 오름차순으로 나오도록