언어 공부 내용 정리/Java

객지프 기말대비 정리 (3-4장)

wosrn 2023. 7. 15. 01:57

<3장 : 배열>

  • 배열 : 같은 타입의 데이터들이 인덱스와 함께 저장된 자료구조
  • 인덱스는 0부터 시작
  • 배열 선언과 생성 ; int [] array = new int [5]; -> 좌변은 선언만 한거(레퍼런스 변수(주소값)만 선언하고 실제 배열은 아직 생성 안된거, 우변 코드까지 써야 실제 배열이 생성됨)
  • 배열 선언과 동시에 초기화 : int [] array = {1,2,3,4};
  • 하나의 배열을 다수의 레퍼런스가 참조 가능 : int []myArray = array;

 

양수 5개를 배열에 입력받아 최댓값 출력하는 예제
처음엔 인덱스0에선 무조건 max 에 array[0]을 대입하고 그 뒤로 비교해야한다고 생각했는데 max에 0을 넣어놓으면 그냥 다 비교로 처리해도 되는거였다
 

  • 배열의 크기 -> length필드
  • for-each 문 : for(자료형 변수명 : 루프형 객체(배열)) -> 변수가 1증가할때마다 그 변수가 배열 원소의 값으로 인덱스0값부터 차례차례 설정됨
  • 이차원 배열의 length 필드 : 배열명.length 이면 행(층)의 개수 / 배열명[n].length이면 n번째 행의 열의 개수
  • 비정방형 배열 ; 각 행이 열의 개수가 다른 배열 -> int i[][] = new int [4][] ; i[0] = new int [1]; i[1] = new int [2]; 
비정방형 배열 + 이차원배열(+2중중첩반복) 보기 좋은 예제

 
 

  • 메소드에서 배열 리턴 : 배열의 메모리 전체가 아닌 레퍼런스를 리턴 , 리턴타입에 배열의 크기를 지정하지 않음 -> int[] array(){  ....return 배열이름;}

배열을 리턴하는 makeArray() 함수를 만들고 메인메소드에서 새 배열 생성 후 그 배열에 makeArray()의 리턴값을 받음
makeArray() 메소드는 temp라는 레퍼런스 변수 이름을 가진 4칸짜리 배열을 만든 후 레퍼런스 변수인 temp를 리턴, 즉 주소값을 리턴하는 메소드 -> 이후 새로 생성한 배열의 레퍼런스 변수에 makeArray가 리턴한 레퍼런스 변수를 받음 => temp와 intArray 가 모두 4칸짜리 배열을 가지게 됨(주소값을 공유하니까)

위와 비슷한 예제 - 0,1,2,3 값을 갖는 4칸짜리 정수 배열을 생성하여 리턴하는 메소드를 작성하고 이 메소드로부터 배열을 전달받아 출력하는 프로그램을 작성
  • 메소드에서 배열의 레퍼런스를 리턴하고 (+메소드 안에선 배열 생성만 해도 되고 값 대입까지 해도 됨) 메인메소드(프로그램)에선 별도의 배열에 메소드의 리턴값을 대입하는 구조를 기억

 

  • main() 메소드 : 자바 응용 프로그램의 실행 시작 메소드, 반드시 static/public/void/매개변수 타입은 문자열 배열
  • main(String [] args)메소드의 인자 전달 : 매개변수로 명령행 인자의 전달

<예외 처리>

  • 예외 : 오동작이나 결과에 악영향을 미칠 수 있는 실행 중 발생한 오류

      1) 정수를 0으로 나누는 경우
      2) 배열보다 큰 인덱스로 배열의 원소를 접근하는 경우
      3)존재하지 않는 파일을 읽으려고 하는 이유
      4) 정수 입력을 기다리는 코드가 실행되고 있을 때, 문자가 입력된 경우\
 

  • 예외 처리 : try-catch-finally 문
예외가 발생하지 않은 경우엔 실행문 모두 실행 후 finally문으로 , 예외 발생시엔 실행문 중 예외 발생 구간에서 catch부분으로 건너뛰어 catch문 실행 후 finally문으로 감
  • 정수를 0으로 나눌 때는 ArithmeticException, 배열의 범위를 벗어난 접근시엔 ArrayIndexOutOfBoundsException, scanner클래스에서 정수를 입력받아야 하는데 정수가 아닌 값을 입력했을 때는 InputMismatchException, 잘못된 인자 전달 시엔 IllegalArgumentException
예외처리 예제
예외처리 예제 2 : 처음엔 add+=sc.nextInt() 를 19줄에 작성했는데 n = nextint로 19줄을 바꾸고 for 문의 한 i가 끝날 때 add+=n;으로 해도 됨
2차원 배열 예제 : 4년간 학점 입력받아 평균구하기

 

<4장 : 클래스와 객체>

  • 자바의 객체지향 특성 : 캡슐화(클래스, 접근제어자) / 상속 / 다형성(오버로딩 오버라이딩)
  • 클래스: 객체의 속성과 행위를 선언한 객체의 설계도 , 객체 : 클래스의 틀로 찍어낸 실체, 메모리공간을 갖는 구체적 실체
  • 클래스 구성 요소 : 필드(멤버 변수) 와 메소드
클래스는 필드와 메소드로 구성 , 객체 생성시 레퍼런스 변수 선언과 실제 객체 생성(new) 그림으로 나타내줌 , 객체 멤버 접근 시에는 . 연산자 이용
  • 하나의 프로그램이 여러 클래스로 구성되는건 가능, 하지만 메인메소드는 프로그램(클래스) 당 하나만
  • 보통은 클래스(설계도)와 실제 객체 클래스를 다른 클래스로 작성함

 
<생성자>

  • 객체가 생성될 때 초기화 목적으로 실행되는 메소드 
  • 객체가 생성되는 순간에 자동 호출 : 매개변수 타입과 개수로 자동으로 맞는 생성자 매치하여 호출
  • 생성자 이름은 클래스 이름과 동일
  • 생성자는 여러개 작성 가능하지만 매개변수 수와 타입으로 구분이 가능해야함
  • 생성자의 목적은 객체 생성 시 값들을 초기화 하는것
  • 매개변수와 초기화코드가 둘다 있을수도 있고 하나만 있을수도 있고 하나도 없을수도 있음
  • 생성자는 리턴타입이 없는 메소드
  • 기본생성자 : 매개변수, 초기화작업이 아무것도 없이 단순 리턴하는 생성자 - 개발자가 생성자를 하나도 만들지 않을때 컴파일러에 의해 자동생성
생성자+객체 기초 예제지만 감잡기를 위해 / 생성자 메소드는 접근지정자는 생략, static은 안쓴거

 

  • this 레퍼런스 : 객체 자신에 대한 레퍼런스 -> this.멤버 형태로 멤버 접근에 사용
  • static 은 객체 생성 없이도 사용 가능함을 뜻하는 메소드이기 때문에 this 사용 불가(가리킬 객체가 없음)
  • this() 로 다른 생성자 호출 : 생성자 내에서 같은 클래스의 다른 생성자를 호출할 때 사용 , 생성자 코드의 제일 첫 줄에 있어야 함
this 생성자 예제

 

  • 객체 배열 선언과 생성 : 일반 배열과 동일

 
 

  • 메소드 형식 : 접근 지정자 + (Static) + 메소드 이름 (메소드 인자들) { 바디 }
  • 인자 전달 -> call by value vs call by 레퍼런스 : 전자는 값이 복사되어서 전달되기 때문에 전달된 인자의 값 그대로인 반면 후자는 배열이 통째로 전달되는게 아니라 배열의 주소값이 복사되어 가기때문에 전달된 객체 값 자체가 바뀐다(두 객체가 같은 객체가 됨)

 

악 슬슬 헷갈리기 시작 ...! 결과물을 내야한다고 해서 꼭 리턴타입이 있어야하는건 아님(메소드 안에 출력문 작성하면 됨)
객체 쓰는 문제랑 아닌 문제 구분
객체 쓰는거든 아니든 메인메소드 밖에 사용할 메소드랑 클래스 코드 구현하고 메인 안에서 실행할 문장들 입력하면 됨
 
<오버로딩>

  • 한 클래스 내에서 두 개 이상의 이름이 같은 메소드 작성
  • 메소드 이름은 동일해야함
  • 매개변수의 개수가 서로 다르거나 타입이 서로 달라야 함 ./ 리턴타입은 오버로딩과 관련 없음
  • 대부분 생성자에 대해 이뤄지지만 생성자 말고 일반 메소드에 대해서도 함 ( 오버라이딩과의 차이는 아마 오버라이딩은 메소드 내용이 바뀌는데 오버로딩은 메소드 내용은 동일하되 매개변수의 종류와 개수 차이)

 

  • 객체 치환 시 주의점 : 객체 치환은 객체의 복서가 아니고 레퍼런스의 복사이다
  • 객체 소멸 :  자바 가상 기계의 고유한 역할 / 가비지 : 가리키는 레퍼런스가 하나도 없는 객체 ->자바가상기계의 가비지컬렉터가 자동으로 가비지를 수집하여 반환함
  • 강제 가비지 컬렉션 수행 : System.gc() 

<패키지>

  • 상호 관련 있는 클래스 파일(컴파일된 .class)을 저장하여 관리하는 디렉터리

<접근 지정자> : 클래스(클래스는 public이랑 default만 가능), 메소드, 필드 앞에 붙임
private - default - protected - public  순으로 범위 넓은
private : 해당 클래스 내에서만 접근 가능
default : 동일 패키지에 허용
protected : 동일 패키지. 다른 패키지 중 자식클래스에는 허용
public : 모든 클래스에 허용 , 하지만 다른 패키지에서 쓰려면 import는 해줘야함 : 다른 패키지에서 public 멤버를 사용하려면 import 패키지명.클래스명; 을 위에 작성해주어야한다. import는 다른 패키지 내에 있는 클래스를 사용하겠다는 뜻이다
 
<static 멤버> : 객체를 생성하지 않아도 바로 사용 가능한 멤버

  • npn-static멤버(인스턴스 멤버)는 객체 생성 시마다 별도의 객체가 생기는 반면(각각의 메모리 공간 생성), static 멤버(클래스 멤버)는 한 클래스 당 하나만 생성되어 동일 클래스 내에선 최초 생성된 멤버를 공유한다
  • static멤버는 클래스 이름과 객체의 멤버로 모두 접근이 가능한 반면 non-static멤버는 클래스 이름으로 접근 안됨
  • static은 전역변수와 전역 함수를 만들 때 혹은 공유멤버를 만들고자 할때 사용
  • static메소드는 오직 static멤버(필드,메소드)만 접근가능(static메소드가 non-static멤버 사용할 수 없음)  / non-static멤버는 static멤버 접근 가능 / 단 static 안붙은 class의 객체 생성을 static메소드인 main메소드에서 하고 그 객체의 non-static멤버에 접근하는건 가능함 (클래스는 static 붙일  수 없어서인듯)
  • static메소드는 this 사용 불가
static 예제 : 클래스로 메소드에 접근 가능

 

  • final클래스와 메소드 - 더이상 상속과 오버라이딩 불가능
  • final 필드 - 상수 선언 시 사용 , 선언 시 초기값 지정해야 하고 실행 중 값 변경 불가 (static final double pi = 3.14;)

 

static 활용 예제
  • 한 클래스 파일(.java) 안에 클래스 두개 작성 시에 주의점 : 클래스명은 실행코드(main메소드)가 있는 클래스의 이름으로 해야함

 
 
다시 풀어보기 : char[] 배열을 선언하고 선언한 배열을 전달받아 배열 속의 공백문자를 ','로 대치하고 전과 후를 출력하는 메소드와 메인메소드 작성하기
 
<문제모음>

배열+예외처리 혼합문제
non-static인 class와 그 안의 멤버들을 바깥에서 객체 생성하여 접근하는 건 가능 ! (기본적으로 static은 객체 생성 안할 때 나오는 개념) + static멤버 공유 사례
유사 예제 ! 사각형의 너비와 높이 입력받아 사각형 넓이 출력하는 프로그램

주의할 문제 !! 
14줄까지만 입력하면 객체 배열의 레퍼런스 변수만 생성된 상태임(일반 객체로 생각해도 저렇게만 하면 레퍼런스 변수와 빈 칸만 생성한 상태)
단 일반형 객체의 경우 저기에 바로 값을 넣으면 되는데 객체배열은 객체 생성 후 값을 대입해야 함(혹은 생성자 자체에 초기화할 값을 넣거나)
 

반복문 쓸까 말까 고민했던 문제,,, 반복횟수 2 이상이면 쓰자
제목이랑 저자에 스페이스바가 들어가기때문에 nextLine을 써야함 (전 입력에서 공백까지 먹기 위해)
배열 생성(레퍼런스 변수 선언)- 각 칸마다 객체 생성 의 흐름
 
<추가 주의사항들>

  • default 클래스는 같은 패키지 내에서 접근 가능 - 별도 import문 없이 바로 객체 생성 가능함
  • 징징이 010-3333 식으로 공백과 엔터중 하나만 써서 입력할때는 다 next로 써도됨
  • 객체생성은 상속이랑 구분 ! 상속받아야 객체 생성 가능한거 아님, 클래스가 접근 가능한 클래스이기만 하면 객체생성 가능