본문 바로가기
Study/Java

04. <배열, 가변배열, 객체지향1 > ~자바의 정석 summary ~

by 하구땡 2023. 1. 11.
반응형

1. 배열

- 배열은 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것으로

  변수의 저장 공간이 연속적으로 배치된다.

 

1-1. 배열의 선언과 생성

*기본형 : 타입[ ] 변수이름

*배열을 선언한 다음에는 바로 배열을 생성해야 한다.

 int [] score = new int [5];

  - 이때 score는 int타입의 5개 배열을 저장할 참조 변수이다.

     1) 배열은 기본값으로 자동초기화된다.

     2) 배열의 인덱스는 0부터 시작한다. (0~배열길이-1)

     3) 위 예시의 경우 score.length = 5이며 index는 0~4까지이다.

     4) 이미 생성된 배열의 길이는 변경할 수 없다.

         =배열이름. length는 상수이며 값을 읽을 수만 있을 뿐 변경할 수 없다.

         ->길이를 변경하고 싶으면 새로운 배열을 생성해야 한다.

    5) 요소 값에 일정한 규칙이 있다면 대부분 for문을 이용해 초기화하지만 

        규칙이 없다면 블록을 이용해 직접 초기화한다.

        int [] score = {90, 80, 75, 89, 100};

 

           1-2. 배열의 출력

*배열을 출력할 때는 for문을 이용해 변수이름. length가 되도록 출력하지만

 더 간단하게 보기 위해서는 Arrays.toString(변수이름) 메서드를 사용한다.

    int [] score = {90, 80, 75, 89, 100};

    System.out.println(Arrays.toString(score));

------------------------------------------

[90, 80, 75, 89, 100]

*println(score)로 입력 시에는 score가 참조변수이므로 주소값이 출력된다.

 -> 그러나 예외적으로 char, string타입의 경우 참조변수로 출력해도 배열로 

    출력된다.

 

 

           1-3. String클래스

[String클래스 = char배열 + 기능(메서드)]

*char배열과 달리 String클래스의 String객체는 읽을 수만 있을 뿐

 내용을 변경할 수는 없다.

 -> 새로운 요소를 가진 저장 공간이 생성되고 그 저장 공간으로 주소값 변경

*String클래스 기본메서드

메서드 설명
charAt(int index) 문자열에서 해당 위치의 인덱스에 있는 문자를 반환
.length() 문자열의 길이를 반환
substring(int1, int2) 문자열에서 해당 범위(int1~int2바로 앞)의 문자열 반환
equals(””) 문자열 내용 동일 여부 확인. true/false (대소문자 구분)
equlasIgnoreCase() 문자열 내용 동일 여부 확인.(대소문자 무시)
char[] toCharArray() 문자열을 문자배열로 변환해서 반환

 

2. 2차원 이상의 배열, 다차원 배열(multi-dimentional)

*기본형:int [][] score = new int [3][4] // 3 - 행, 4-열

*2차원 배열은 주로 테이블 형태의 데이터를 담는 데 사용된다.

*생성과 동시에 초기화하는 방법:

int [][] score = {

                                 {1, 2, 3},

                                 {4, 5, 6},

};

ex.23

int[][] score= {
                      {100, 100, 100},
                      {20, 20, 20},
                      {30, 30, 30},
                      {40, 40, 40},
               };
           System.out.println(score.length);
           System.out.println(score[i].length);
4   //행의 길이
3   //열의 길이

 

3. Arrays클래스 메서드

[1] 1차원 배열의 배열 출력 - Arrays.toString(변수이름)

      2차원 배열의 배열 출력 - Arrays.deepToString(변수이름)

[2] 1차원 배열의 동일 여부 - Arrays.equals(변수이름 1, 변수이름 2)

       2차원 배열의 동일 여부 - Arrays.deepEquals(변수이름 1, 변수이름 2)

[3] 배열의 복사 - Arrays.copyOf(), Arrays.copyOfRange()

      System.arraycopy(num, 0, newNum, 0, num.length);

      -> num배열의 index0번부터 newNum의 index 0번에 num.length의 길이만큼 복사한다.

 

ex.24

int [] arr = {0, 1, 2, 3, 4};

int [] arr2 = Arrays.copyOf(arr, arr.length);  // arr2=[0, 1, 2, 3, 4]

int [] arr3 = Arrays.copyOf(arr, 3);  // arr3=[0, 1, 2] // 인덱스 3-1까지 출력

int [] arr4 = Arrays.copyOf(arr, 7); // arr4=[0, 1, 2, 3, 4, 0, 0]

int [] arr5 = Arrays.copyOfRange(arr, 2, 4);  // arr5=[2. 3]

int [] arr6 = Arrays.copyOfRange(arr, 0, 7); // arr6=[0, 1, 2, 3, 4, 0, 0]

 

[4] 배열의 정렬 - Arrays.sort(변수이름);

    : 배열의 요소를 오름차순으로 정렬한다.

[5] 배열에 저장된 요소 검색 - Arrays.binarySearch()

     : 배열에서 지정된 값이 저장된 위치(index) 반환

- 반드시 배열이 정렬된 상태이어야 올바른 결과를 얻는다.

- 검색한 값과 일치하는 요소들이 여러 개일 경우 어떤 것의 위치가 반환될지 알 수 없다.

[6] 배열 채우기 - fill(), setAll()

*fill() - 배열의 모든 요소를 지정된 값으로 채운다.

int [] arr = new int [5];

Arrays.fill(arr, 9);           //arr={9, 9, 9, 9, 9}

*setAll() - 배열을 채우는 데 사용할 함수형 인터페이스를 매개변수로 받는다.

Arrays.setAll(arr, (i)->(int)(Math.random)*5)+1);

[7] 배열을 List로 변환 - asList(Object... a)

* Object... a <- 가변식 매개변수로 매개변수의 개수를 자유롭게 변경 가능

크기 변경 및 추가, 삭제가 불가능한 List (읽기만 가능)
List list = Arrays.asList(new Integer[]{1,2,3,4,5});
List list = Arrays.asList(1,2,3,4,5);
list.add(6)    // 불가능 - UnsupportedOperationException
크기 변경 가능한 List
List list = new ArrayList(Arrays.asList(1,2,3,4,5));

 

4. 가변 배열

case 1: int [][] score = new int [5][3];

   -> 5행 3열의 2차원 배열 생성

score [0] = {1, 2, 3};

score [1] = {4, 5, 6};...

case 2: int [][] score = new int [5][];           // 가변 배열

           score [0] = {1, 2, 3};

           score [1] = {5, 6, 7, 8, 0};...

 

5. 객체지향 언어

 (1) 객체 : 실제로 존재하는 것. (인스턴스 변수의 묶음/iv 변수의 묶음)

 (2) 프로그래밍 에서의 객체 : 유형체+무형체; 클래스에 정의된 내용대로 메모리에 생성된 것

 (3) 객체지향 장점

           - 코드의 재사용성이 높다.

           - 코드의 유지보수가 용이하다.

           - 신뢰성이 높은 프로그래밍으로 중복된 코드 제거 용이

 

           5-1.class/클래스

(1) 클래스란? ①객체를 정의해 놓은 것으로 객체를 생성하는 데 사용(설계도)

                         ②데이터+함수의 결합

                         ③사용자 정의 타입 - 원하는 타입 직접 생성 가능

변수 배열 구조체 클래스
1 1 1 1 +함수
  2 10.0f 10.0f
  3 ‘a’ ‘a’

*변수 : 하나의 데이터를 저장할 수 있는 공간

*배열 : 같은 타입의 여러 데이터를 하나로 저장하는 공간

*구조체 : 서로 관련된 여러 데이터를 종류에 관계없이 하나로 저장할 수 있는 공간

*클래스 : 데이터와 함수의 결합(구조체+함수)

           ex25.

 
   int hour     = 12;
   int minute   = 34;
   int second   = 56;
Time t = new Time();
 
 t.hour = 12;
 t.minute = 34;
 t.second = 56;
=>둘 다 똑같은 값을 가지고 있지만 왼쪽은 비객체지향적 코드,
  오른쪽은 객체지향적인 코드로 서로 강하게 연결돼 있다.

(2) 객체 - 속성(property)과 기능(function)으로 이루어져 있다.

                이 두 속성과 기능을 그 객체의 멤버(멤버 변수)라고 한다.

               *속성은 변수(variable), 기능은 메서드(method)로 표현

(3) 인스턴스화(instantiate)

  : 클래스로부터 객체를 만드는 과정으로, 이때 만들어진 객체를 인스턴스

    (instance)라고 한다.

 

           5-2. 객체의 생성과 사용

*기본 구조 : 클래스명 변수명 = new 클래스명();

*클래스의 객체를 참조하기 위한 참조변수를 선언하고, 클래스 객체 생성과 주소를 참조변수에 저장한다.

           ex26.

<객체의 생성>
class Mountain {
   Mountain tree = new Mountain();
}
<객체의 사용>
   tree.channel = 7;
   tree.channelDown();
 

 

           5-3. 객체 배열(==참조변수 배열)

Tv tv1, tv2, tv3; 
 => Tv[] tvArr = new Tv[3];
   => 객체배열 생성
tvArr[0] = new Tv();
tvArr[1] = new Tv();
tvArr[2] = new Tv();
   => 1)객체배열 생성 이후 2)각 배열에 대한 객체 생성 별도 필요

 

 

6. 선언 위치에 따른 변수의 종류

class Variables {
 
   int iv;                 // 인스턴스 변수
   static int cv;           // 클래스 변수(static변수, 공유변수)
 
   void method() {
      int lv = 0;          // 지역변수
   }

- 클래스 영역에는 변수 선언/메서드 선언만 가능하다.

- 변수 선언과 메서드 선언의 순서는 정해지지 않는다.

 

*생성시기

  1) 클래스 변수->클래스가 메모리에 올라갈 때 (객체 생성 필요 x)

  2) 인스턴스 변수->인스턴스(객체)가 생성되었을 때

  3) 지역 변수->변수 선언문이 수행되었을 때

 

7. 메서드(method)

: 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것(≒함수)

- 선언부와 구현부로 이루어져 있다.

*기본형 : 반환타입 메서드이름 (타입 변수명, 타입 면수명) {구현부}

int add(int a, int b) { 

    int result = a+b;

    return result;

}

*매개변수 : 메서드가 작업을 수행하는데 필요한 값들을 제공받기 위한 것.

- 일반적인 변수선언과 달리 두 변수의 타입이 같아도 변수 타입 생략 불가능

(1) 기본형 매개변수 - 변수의 값을 읽기만 할 수 있다. (read only)

(2) 참조형 매개변수 - 변수의 값을 읽고 변경한다. (read&write)

          

8. return문

- 실행 중인 메서드를 종료하고 호출한 곳으로 되돌아간다. (필수)

  다만, 반환 타입이 void일 경우에는 생략 가능(이외 불가능)

- 반환타입과 return타입이 일치해야 한다. (자동형 변환 가능)

           ex.27

int max(int a, int b) {
   if(a>b)           return a;
}
int max(int a, int b) {
   if(a>b)       return a;
   else         return b;
}
if안의 타입만 참일때 결과가 출력되고 그 외의 결과엔 출력되지 않아 return문이 없는 것으로 간주된다. 이렇게 해야함.

 

9. 호출스택(call stack)

(1) 스택(stack) : 밑이 막힌 상자. 위에 차곡차곡 쌓인다.

넣을 때 : ①→②→③.....

꺼낼 때 :.....③→②→①

(2) 호출 스택 : 메서드 수행에 필요한 메모리가 제공되는 공간

  -> 메서드가 호출되면 호출스택에 메모리 할당, 종료되면 해제

  -> 하나의 스택에서는 맨 위의 메서드 하나만 실행되고 나머지는 대기 상태

반응형

댓글