HCD 랩스 9월 2주차

우영·2025년 9월 10일

HDC 랩스 풀스택 1기

목록 보기
3/20

9/8

  • 생성자 시작
  • 기본 생성자가 없으면 에러가 날 수 있다. → Spring에서 항상 기본 생성자를 호출함.
  • 메소드 오버로딩 - 매개변수만 다르게 해서 같은 이름으로 정의 가능
  • 생성자가 중복이 일어날 경우 - 생성자 오버로드 : 첫번째줄에 호출 가능
- java를 만들어 컴파일을 하면 .class파일이 만들어짐.
- File system에 static붙은 .class 파일들이 있음.
- 클래스로더 : 나눠어서 관리가 되어짐. 가 .class파일을 읽어서 method area에 펼쳐놈.
- 메인메소드 시작
- jvm의 메모리 공간 - 3개의 공간
    - method area (static) - 메타 데이터(클래스명, 위치), static 멤버를 올려놈(여기서 psvm을 찾음)
    - heap - 객체 생성됨.
    - stack - 메인 영역을 펼쳐놓고 new하면 힙에 메모리를 올려놈.
- static : 공유변수, 클래스변수 / 객체 소유 = 인스턴스 변수, 메소드 클래스 소유 = 클래스 변수
    - 예) 학생이 들어와도(새로운 객체가 생성되도) 고유 번호가 1000이면 1001, 1002이런식으로 달라져야 한다.
객체 외부에서 인스턴스변수와 클래스변수(정적변수)를 접근하는 방법이 다르다.
  => 인스턴스변수는 객체의 소유이므로 객체를 참조하는 변수를 통해서 액세스
 => staticNum은 특정 객체의 소유가 아니라 모든 객체가 공유해서 쓰는 클래스의 변수
 	  클래스명으로 액세스한다.
 	  멤버변수 => 클래스명.멤버변수
	  메소드  => 클래스명.메소드
	 - [API를 사용하는 방법]
	 - String클래스에서 정의된 charAt이라는 메소드를 이용해서 특정 위치의 문자를 찾기
	 - 1.String클래스의 기능을 사용하기 위해서 String 클래스를 메모리에 올리기
	 - 
	 - 		클래스명 변수 = new 클래스명()
	 - 		---------    --------
	 - 		할당되는 클래스   heap에 할당해서 사용하고 싶은 클래스명
	 - 		와 같은 클래스명을
	 - 		정의하고 이 클래스명이
	 - 		타입이된다.
	 - 2.할당된 String객체의 메소드를 사용하기 위해서 .연산자를 이용해서 heap에 할당된 String객체의 기능을 참조해서 사용
	 - => 메소드 호출 
	 - => 메소드 호출 시 매개변수를 확인하고 적절하게 값을 넣어서 호출해야 한다.
	 - 3. 메소드의 실행결과(리턴값)이 있으면 실행결과와 같은 타입의 변수를 선언해서 실행결과를 저장해서 활용
Person 클래스의 특징을 정의
  접근제어자
  public: 모든패키지의 모든 클래스에서 접근가능
  protected: 같은 패키지의 모든 클래스에서 접근이 가능하고 다른 패키지에서는 상속관계에 있는 클래스만 접근이 가능
  default: 같은 패키지의 모든 클래스에서 접근이 가능
  private: 선언된 클래스에서만 접근할 수 있다.
 => 특징을 표현 할 수 있는 데이터를 정의
<<생성자>>
생성자는 객체가 생성될 때 한번만 호출되는 특별한 메서드
[객체생성]
클래스타입 변수 = new 생성자() 
-------          -------   
^                    ^
|_ 사용할 클래스의 타입    | _ 클래스 안에 미리 정의되어 있는 생성자 메서드를 호출
						특별한 메소드지만 일반메소드와 동일하게 머세드를 실행할 때 외부에서
						데이터를 입력 받아서 사용하는 것이 가능
							 -------------
							    ^
							    |_ 매개변수를 전달 받을 수 있다.
- 일반메서드와 다르게 생성자는 객체가 생성되는 시점에 딱 한번만 호출되는 메서드
- new 연산자가 생성자 메서드를 보고 메모리에 할당해야 하는 클래스가 무엇인지 파악하고 작업해야 하므로
  생성자메서드에는 규칙이 존재 
 - 생성자 메소드는 주로 어디에 써? 여기서 뭐하지??
 => 객체가 생성되면서 처리해야 하는 기능이나 처음 한 번 실행되어야 하는 로직을 정의할 목적
 => 주로 API의 생성자는 DB연결, 네트워크 접속, OS통신.... 작업을 통해서 개발자가 직접하기 어려운 작업을 실행
 => 사용자가 만드는 클래스의 생성자는 주로 객체가 갖고 있는 값을 초기화하는 용도로 사용
[생성자 작성 규칙]
1. 객체가 생성되면 무조건 생성자가 호출된다. 개발자가 생성자를 정의하지 않으면 컴파일러가
	매개변수가 없는 생성자를 제공한다.(기본생성자)
2. 생성자를 정의하는 경우 생성자의 이름은 무조건 클래스명과 동일해야 한다.(대소문자까지) - 15줄 참고
3. 생성자메소드는 리턴타입을 정의하지 않는다.(void도 정의하지 않는다.)
4. 셍성자도 메소드이므로 매개변수를 정의할 수 있다.
	=> 생성자에서 멤버변수를 초기화할 수 있도록 코드를 작성하는 것이 일반적
5. 클래스를 정의하면서 개발자가 생성자를 추가하면 컴파일러는 더이상 기본생성자를 제공하지 않는다.
6. 프레임워크 내부에서 객체가 만들어질때 기본생성자를 호출해서 생성이 되므로 기본생성자는 사용하지 않아도 무조건 정의합니다.
7. 생성자도 메소드처럼 오버로딩이 가능합니다.
	- 매개변수 타입이나 갯수를 다르게 해서 동일한 이름의 메소드를 정의할 수 있는 것처럼 생성자도 매개변수 갯수나 타입을 
	다르게 해서 여러 개를 정의할 수 있다.
	- 사용목적에 따라서 다양한 생성자가 필요할 수 있다.

8.생성자안에서 또 다른 생성자를 호출할 수 있다.
  - 생성자가 오버로딩 되어 있는 경우에 사용
  - [문법]
   this(매개변수1, 매개변수2....) // this : 현재 작업중인 객체
   -------------------------
   호출하고 싶은 생성자의 매개변수 갯수와 타입에 맞게 값을 정의해서 호출
   - 생성자 호출문은 무조건 생성자의 첫 번째 문장에 정의해야 한다. 

9/9

  • static 블럭, static 클래스 변수

  • 자료구조(자료를 담는 것) - 알고리즘 공부

    • 배열(필수) : 연속된 자료 공간, new로 힙에 할당, 편하게 사용하기 위함(메모리를 관리하기 위함이 아님)
      • 순서
      1. 배열선언 : int형 그릇 만들기 - int[] myarr; // myarr이름의 int형 배열
      2. 배열생성 : 몇개의 그릇 만들지 정하기 - myarr = new int[5];

> 1. 배열의 선언
		 - 힙에 할당된 배열을 참조할 변수를 정의하는 과정
		 [형식]
		 데이터타입[] 변수명;
		 데이터타입 변수명[];
		 ex) int형 데이터를 여러 개 저장할 수 있는 배열변수를 선언
		 int[] myarr;
		 int myarr[];
		 int[] myarr; // int형 배열을 참조하는 참조변수 myarr를 정의
		 2. 배열의 생성
		   - 실제로 데이터를 저장할 수 있는 구조를 메모리에 만드는 과정
		   - 생성된 배열은 힙에 할당
		   - 배열을 실제 프로그램 안에서 사용하기 위해서 동일한 타입에 변수를 할당
		 3. 배열의 요소를 액세스
		   1) 배열의 초기값
		      - 생성되는 배열의 요소는 초기값을 가지고 있다. 
			  - 정수:0, 실수:0.0, boolean:false, 참조형:null
		   2) 배열 요소 액세스하기

> 배열 변수에서 요소를 하나씩 꺼내서 변수에 저장한 후 사용
		  for(데이터타입 변수: 배열변수(컬렉션변수)){
		         -------           -------
		  }	
         데이터 타입 변수 : 배열에 담겨있는 요소의 타입으로 변수의 타입을 정의
         컬렉션변수 : API에서 제공하는 자료구조

  • 배열 - String
    • 참조형 중에서 String만 예외로 값이 나옴
  • 객체 담는 배열, 배열 복사, 다차원 배열 등
  • 얕은 복사, 깊은 복사, 2차원 배열
  • 2차원 배열
  • 예제 ArrayMovieExam
	 * Movie객체 3개를 참조할 수 있는 movie배열 만들기
	 * -영화 3개의 정보를 저장하세요
	 * - 배열에 저장된 각 영화의 정보를 출력하세요
	 * [출력 형식]
	 * 영화명:
	 * 상영년도:
	 * 금액:
  • 예제 ArrayExam1
//int형 데이터 3개를 담을 수 있는 배열을 선언하고 각각 100 200 300을 할당
//모든 배열의 요소의 값을 더해서 결과를 출력
//[출력형식]
// 배열의 합: ___
  • 예제 ArrayExam3
* 1. 임의의 값 5개를 초기값으로 해서 int형 배열을 정의
 * 2. 향상된 for문을 이용해서 배열의 요소를 액세스
 * 3. 각 배열의 요소가 짝수인지 홀수인지 판단해서 출력하기
 * [출력형식]
 * 0번요소 97(홀수)
 * 1번요소=>68(짝수)

9/10

Today
1. 상속과 다형성

Assignment
1. 9/8일 예제 정답 맞춰보기, 9/9일 배열연습 2번 , 과제 상속과제

  • 상속
    • 중복된 내용들을 클래스로 만들고 상속 받게끔 만들어짐.
    • 직접 정의하지 않아도 재정의 가능
    • 상위 클래스 super
    • 하위클래스 child
      • Class child extends super
    • 메소드 재정의 - 자식 클래스에서 메소드를 재정의
  • CI/CD, DevOps -> 배포와 관련
  • 상속 예제1 동물after,
    • bin은 .class파일들
    • 모든 클래스들의 중복되는 멤버를 이용해서 클래스를 새롭게 정의 - 일반화된 내용으로 클래스를 정의, 상속 관계에서 상위 클래스를 정의

Person.java
1. staff,Student, Teacher의 중복되는 멤버를 이용해서 Person 클래스를 만들기

  • person클래스를 구성하는 구성요소는 private를 제거한다.
  • staff, student, Teacher가 Person을 상속하도록 작업
  1. TestSchool을 실행하면 기존 클래스의 실행결과와 동일한 결과가 출력되도록 작업
    => 제출
  • 예제 InheritanceTest1.java
    <<상속관계에서 멤버변수가 갖는 특징>>
    	 * 1. 상속관계에서 상위클래스에 선언된 멤버변수는 하위클래스에서 접근이 가능하다.
    	 * 2. 하위클래스 타입의 참조변수를 이용해서 상위클래스에 선언된 멤버변수를 액세스할 수 있다.
    	 * 3. 상위클래스에서 선언된 멤버변수명과 동일한 이름의 멤버변수를 하위클래스에서 정의하면 하위클래스 내부에서는 부모클래스의 멤버변수가
    	 * 인식되지 않고 하위클래스의 멤버변수가 인식된다. //부모에도 있지만 내거가 먼저 선언됨.
         => 객체의 변수는 컴파일 시점에 타입이 결정된다.(컴파일러가 참조 변수 타입을 기준으로 결정)
    	 * => 이름이 동일하면 즉 부모타입의 변수와 동일한 변수가 정의되면 부모의 변수가 숨겨진다.
    	 * 4. 하위클래스에서 상위클래스의 멤버를 접근하고 싶은 경우 super키워드를 이용해서 접근
    	 * 	  this => 자기 자신의 객체(현재 작업중인 객체)
    	 * 	  super => 부모 객체
    	 * 5. 상위클래스의 멤버가 private으로 정의되어 있으면 하위클래스에서 액세스할 수 없다.(상속되지 않는다.)

  • 예제 InheritanceTest2.java
<<상속 관계에서 메소드가 갖는 특징>>
* 1. 상위클래스에서 정의된 메서드를 하위클래스에서 호출할 수 있다.
* 2. 하위클래스 타입의 참조변수를 통해서 상위클래스에 정의된 메소드를 정의할 수 있다.
* 3. 상위클래스에서 정의된 메서드와 동일한 메소드를 하위클래스에 정의할 수 있다.
*                                            --------------
                        매개변수의 갯수와 타입이 같고 리턴타입이 같은 메소드
*    => 동일한 메서드의 기준은 리턴타입, 메소드명, 매개변수갯수, 매개변수 타입이 모두 동일
*    => 하위클래스에서 부모클래스에 메소드와 동일한 메소드를 정의하는 것을 메소드 재정의 즉, 메서드 오버라이딩이라한다.
*    => 오버라이딩된 메소드가 있으면 오버라이딩된 메서드가 호출
* 4. 메소드는 동적 바이딩으로 결정된다.
* => 실행 시점에 매핑된 객체의 메소드가 호출
* 5. 상위 클래스에 정의된 메소드를 호출하려면 super키워드를 이용해서 호출
*                                                       -----------
*                                 일반적인 경우에는 super 키워드 쓰지 않고 바로 호출 가능
*                                 오버라이딩된 메소드인 경우에 부모 메소드를 호출하고 싶다면 super이용하기


  • 자기 자신 호출해서 오류남 - super.를 붙이면 됨.
  • 예제 InheritanceTest3.java

  • 모든 자바의 최상위 클래스 Object 클래스 - extends Object를 적지 않아도 상속하는 클래스가 없는 경우 컴파일러가 자동으로 상속해줌.


  • 예제 InheritanceTest3.java
* <<상속관계에서 생성자가 갖는 특징>>
*  1. 자바로 만들어지는 모든 클래스의 최상위 클래스는 java.lang.Object클래스이다.
*  => 자바에서 객체가 갖는 공통의 특징을 java.lang.Object클래스에 정의하고 상속하는 클래스가 따로 없는 경우
*  	컴파일러를 통해서 자동으로 상속받도록 한다.
*  => JVM위에서 클래스가 실행되려면 내부에서 인식하는 공통의 타입을 갖고 있어야 하며 이 타입이 java.lang.Object -> 다형성까지 가야 이해 됨.
*  
*  2. 하위클래스를 객체생성하면 자동으로 상위클래스들이 같이 생성된다. //new 클래스명 하면
*  	=> 하위클래스보다 상위클래스가 먼저 객체생성된다.
*   	=> 상위클래스가 하위클래스보다 먼저 생성되기 때문에 하위클래스에서 상위클래스의 메소드를 사용할 수 있다.
*  	=> 모든 클래스의 생성자의 첫 번째 명령문은 부모 클래스의 기본 생성자를 호출하는 명령문이 생략되어 있다. // super();
*      => 상위클래스에서 정의된 내용을 하위클래스에서 사용할 수 있도록 하려면 상위클래스가 메모리에 먼저 할당되어야 하므로 
*      =>super()를 이용해서 자동으로 상위클래스가 생성될 수 있도록 기본설정 
*  3. 보통 자바에서 클래스를 직접적으로 사용하는 경우는 상위클래스보다는 하위클래스로 객체를 생성해서 사용한다.
*  	=> 상위클래스는 일반적인 내용을 담고 있는 클래스로 완성되지 않은 내용일 수 있다.
*  	=> 보통은 하위클래스를 생성해서 사용하는 것이 일반적이다.

결론 : JVM에서 돌아가는 타입과 모든 사람들이 만든 클래스의 타입이 다르다. 기억도 못할 뿐더러 다르기 때문에 기본이자 상위 클래스인 Object 타입으로 개발자의 실수를 방지하기 위해 자동으로 처리.


  • Person 변수를 private로 설정했을 때,

    • //1. 에러가 발생하지 않도록 수정
      //2. student, staff display메소드내부에서
      //Person의 display를 호출해서 처리하도록 변경
  • 예제 Beverage, BeverageTest, Coffee
    상속연습1

  • : private, + : public, # : protected,


  • 예제1 chap02.ReferenceVarTest (//기본형과 참조형의 비교)
  • 예제2 TestAccount 상속연습2
    • 문자열상수와 equals를 제대로 안봐서 못품.
    • 생성자 매개변수 달라서 에러남.

책정리 - ~P267

  • 다형성 - 오버라이딩 쓰는 이유?를 알기 위해서 아래 4가지를 알아야함. 진도 나갔는지 : O/X
    • 상속 - O
    • 오버라이딩 : 상위클래스의 메소드를 하위 클래스에 재정의 하는 것(매개변수가 완전히 동일해야함) - O
    • 객체의 형변환 - X
    • 추상메소드 - X

  • 형변환
    • 예제 RefTypeCastingTest //기본형변수의 캐스팅
객체의 형변환(참조형에서 형변환)
		=>상속관계가 있어야만 가능
		상속관계에 있는 클래스는 자동캐스팅 - API
		[문법]
		상위 클래스타입 변수 = new 하위클래스()
		String str = new Random() ; --> 상속관계가 아니므로 형변환을 할 수 없다. 
	//is a 가 성립 하면 상속을 만들 수 있다. Person is a Staff
	//부모타입 = new 자식객체() ------OK
	Person p = new Staff();
	//자식타입 = new 부모객체() ------ X
	//Staff staff = new Person();
 결론 person보다 Staff(person+staff)의 기능이 많아서 담을 수 없어서 반대가 안됨.
  • 예제 RefTypeCastingTest2

9/11

Today
1. 다형성과 인터페이스

Assignment
1. 9/8일 예제 정답 맞춰보기, 9/9일 배열연습 2번 , 과제 다형성과 인터페이스 과제
[출처] 다형성과 인터페이스 과제|작성자 heaves1

  • 과제 1번 풀이
  • 상속관계에 있는 클래스는 자동으로 캐스팅
    - 서브클래스의 인스턴스를 슈퍼타입으로 변환해서 작업(업캐스팅)
    - 컴파일 시점에 참조변수의 타입에 따라서 사용이 가능한 멤버가 결정
    - 멤버변수의 타입은 컴파일 시점에 결정(정적바인딩)
    - 메소드는 동적바인딩
    동적바인딩 -------
    런타임 시점에 실제로 생성되는 객체를 확인하고 메소드의 샐행도 실제 생성되는 객체의 메소드가 실행
    - 단, 참조변수의 타입에 해당하는 멤버들만 접근 가능
    obj3 instanceof Sub); //obj3이 Sub의 인스턴스가 맞아??
  • 바인딩 : 객체와 참조하는 = 과 같은 관계

이해 X

  • Super obj3 = new Sub(); // Obj3의 타입은 Sub객체를 참조
    • 부모 타입 변수로 자식 객체를 참조하는 것"이고, 참조는 Super처럼 하지만 실제 동작은 Sub 방식으로 실행
      • 그래서 메소드오버라이딩(메소드 재정의)해서 씀.
  • ((Sub)obj3).test(); (부모엔 test가 없고 자식엔 있음) - 다운캐스팅, 불안정
    • 다운캐스팅 = 자식클래스로 형변환, 업캐스팅 = 부모클래스로 형변환
      • 부모엔 test가 없으니까 명시적으로 실제 동작하는 Sub으로 형변환을 해줘야 함 .

// 객체의 형변환의 활용

  • 예제 RefTypeCastingTest3

    = 클래스의 이름이 바뀔수도 있고 많아질수도 있다.

  • 추상클래스

    • 이유 : 밑에 사진처럼 상위클래스에 메소드 오버라이딩을 위해서만 만들어져 있는 test() 메소드가 있다.
    • 이 메소드들을 보면 찝찝한 느낌이 드는데 이걸 해결 하기 위함.

  • 추상클래스
  • 예제 chap09.00p.poly.AbstractTest
    • 추상클래스
  • => 객체를 생성할 수 없는 클래스, 미완성된 클래스
  • => 내용이 구현되어 있지 않은 메소드를 포함하고 있는 클래스를 추상클래스라고 한다.
  •   -----------------------
  • 추상 메소드(body가 없는 메소드)
  • 1) 추상 메소드를 선언하는 방법
  • 접근제어자 abstract 리런타입 메소드명(매개변수1, 매개변수2...)
  • 2) 추상클래스의 특징
    • 추상 메소드와 일반메소드를 모두 정의해서 사용할 수 있다.
    • 추상메소드를 갖고 있는 클래스는 미완성 클래스를 의미하므로 클래스 선언부에 abstract를 추가해야 한다.
    • 추상클래스는 객체 생성을 할 수 없다.(완성된 클래스가 아니므로)
  •           -----------------
  •           상위클래스로 사용할 목적으로만 사용
  •           
  •           
  • - 추상클래스를 상속받는 클래스는 에러가 발생
  •   => SubA가 SuperA를 상속하면 SuperA의 모든 멤버가 SubA의 소유가 된다.
  •   	SubA는 일반메소드인 test도 상속받지만, 추상메소드인 run도 상속받으면 SubA도 추상클래스가 된다.
  •   
  •   [에러처리]
  •   - abstract를 subA클래스 선언부에 추가
  •   - 추상클래스가 갖고 있는 모든 추상메소드를 재정의해서 메소드를 구현헤애 한다.
  • 어노테이션 (@로 시작하는거)
    • 컴파일러에게 정보를 알려주는 작업
    • @Override는 컴파일러에게 이 메소드는 오버라이딩된 메소드라는 것을 알려주는 기호

  • 다형성
    • 타입을 동일하게 하면 동일한 타입 실행시점에 어떤 객체가 바인딩되는지에 따라서 바인딩이 실행되어 다양한 메소드를 설계하는 것 -> 유지보수하게 편하게 만듦.
  • 예제 1 다형성연습.zip
    • 못품..
  • 예제2 다형성 예제
    • 부모의 맴버변수를 자식에서 값을 변경하려면 set변수명() 써야함.

  • 자바는 타입이 중요함.
  • 다형성 예제 문제풀이
  • 예제 2 다형성예제2
    어려움, 못품 다시 해보기
  • 추상 클래스 : 추상메소드, 일반메소드를 가지고 있음. 중간 단계
  • 인터페이스 : 추상 메소드만 갖고 있는 클래스, 다중 상속를 하기 위함, 다형성 확장(여러 개의 타입을 확장함.) -> 전혀 다른 그룹으로 묶어서 더 확장하고 싶을 때 사용
    예) 오리 클래스 - 날수 있는 것들, 못나는 것들이 있을 텐데 날 수 있는 것들만 따로 모아 만듦. 그럼 새 클래스에서도 날수 있는 것들에 대해서는 다중 상속할 수 있음.

  • 인터페이스
    • 예제 InterfaceTest1
[인터페이스의 특징]
- 추상메소드만 정의하는 메소드
- 다형성과 다중상속을 위해서 사용

1. interface키워드를 이용해서 정의
2. 인터페이스는 추상메소드만 관리하는 특별한 클래스이므로
   인터페이스에 정의하는 메소드는 public과 abstract가 생략 가능
   => 구현할때 자동으로 public이 추가
3. 클래스를 extends로 상속하고 인터페이스는 implements로 구현
4. 인터페이스가 인터페이스를 상속할 수 있다.
   - 인터페이스끼리 상속하는 경우 extends를 사용
   interface A{
   }
   interface B{
   }
   interface D extends A,B{
   {
   -인터페이스끼리는 다중 상속이 가능 ,로 구분해서 나열
5. 클래스가 인터페이스를 상속하는 경우 다중 상속이 가능
   ,로 구분해서 나열
ㄴ6. 클래스가 클래스와 인터페이스를 상속하는 경우 클래스 상속문이 인터페이스보다 먼저 정의해야 한다.
     =>extends를 implement보다 먼저 써야한다.

대부분 구조 -> 가장 상위 인터페이스 - 중간 추상 - 하위 클래스


9/12

다음주 파이썬 github(브랜치 = 각자각자가 코딩하는 공간) 이클립스 연동 -> 라즈베리파이 끝나고 리눅스

Today
1. 14장 예외처리, API

Assignment
1. 9/8일 예제 정답 맞춰보기, 9/9일 배열연습 2번 , 예제3 ExceptionExam02 // 예외처리 연습 이해하기,

  • APi 확인 했을때 throws 붙어 있으면 - 오류가 발생하면 처리해주세요란 뜻.
  • 예제 ExceptionTest1
1.개발자가 실수할 수 있는 부분
		System.out.println("***********프로그램시작************");
		int[] myarr = new int[3];
		//System.out.println(myarr[3]); //ArrayIndexOutOfBoundsException
		//System.out.println(10/0); //ArithmeticException
		String str = null;
		//str.length(); // NullPointerException
		
		//2. 외부요인이나 사용자의 실수로 발생할 수 있는 Exception
		Scanner key = new Scanner(System.in);
		System.out.println("값 입력(숫자입력):" );
		int data = key.nextInt();
		System.out.println("사용자 입력한 값: ");
		
		
		//3. API에서 컴파일 시점에 예외를 체크하는 경우
		// => API의 메소드 선언부에 throws XXXXXException을 throws하는 것은  이 메소드를 사용하는 중에
	    // XXXXXException이 발생할 가능성이 있다는 것을 의미
		// =>RuntimeException의 하위 Exception을 메소드에서 throws을 하고 있어도 컴파일 시점에 체크하지 않는다.
		// => RuntimeException의 하위가 아닌 Exception들은 컴파일 시점에 체크를 하므로 무조건 예외처리를 해야 한다.
		// 하지만 RuntimeException의 하위이거나 아니거나 무조건 예외발생 가능성이 있는 코드는 무조건 예외처리를 해야 한다.
  • 예제1 ExceptionTest2 //자바에서 예외를 처리하는 방법: try~catch

  • 예제2 ExceptionTest3 // 자바에서 예외를 처리하는 방법:try~catch~finally
    • finally는 예외가 발생하거나 발생하지 않거나 무조건 실행될 명령문을 정의
  • 예제3 ExceptionTest4 //while문을 사용시 Exception 선언

  • 예제1 ExceptionTest4//while문을 사용시 Exception 선언
  • 예제2 ExceptionTest5//다중 catch
    • 각각의 예외에 다라 다르게 처리하고 싶은 경우 다중 catch 정의하고 사용
      => 다중catch를 사용하는 경우 상위클래스에 해당하는 Exception은 하단에 정의
  • 예제3 ThrowsTest1
    • // => 무조건 예외는 try~catch로 처리해야 한다.
      // => throws를 한다는 의미는 예외를 발생하는 곳에서 처리하지 않고 호출하는 곳에서 처리하겠다는 의미
    • // 2. 예외가 발생한 곳에서 처리하지 않고 호출한 곳으로 예외를 던지기
      // 예외가 발생하더라도 예외가 발생한 메소드 내부에서 처리하지 않고 예외를 호출한 곳으로 전달
      // 이 메소드(예외 발생 가능성이 있는 메소드)를 호출한 곳에서 각각 원하는 대로 예외를
      // 다양하게 처리 할 수 있다.
  • 예제4 test1 ,test2
  • throws : 예외처리 가능성이 있는 코드란 뜻 선언부에 정의하고 미루는 것
    • 호출하는 쪽에서 예외처리하라는 뜻
  • throw : 내가 발생시키고 싶을 때 사용하는 것.

  • 예제1 MyException //사용자 정의 예외 클래스를 작성
    • 예외클래스로 만들고 JVM시스템 내부에서 예외클래스로 동작하도록 해야 하므로
      Exception클래스의 하위로 만들어야 한다.
  • 예제2 MyExceptionTest
    • 예외를 발생시키기
    • 예외를 발생시키면 이 문장이 예외가 발생하는 코드가 되므로 예외를 처리해야 한다.
  • 예제3 ExceptionExam02 // 예외처리 연습
package chap14.exception; // 내가 푼 거 

import java.util.Scanner;
public class ExceptionExam02{
	//필요할 경우 다음의 메서드 선언부분(메서드 시그너처)을 수정하시기 바랍니다.
	public static void main(String[] args) throws Exception{
		Scanner scan= new Scanner(System.in);
		System.out.println("숫자로 변환할 문자열을 입력바랍니다.");
		String str= scan.nextLine();
		int result= 0;
		result = Integer.parseInt(str);
		if(str.length() == 0 || str.equals(null)) {
			throw new Exception("예외가 발생되었습니다. 문자열을 입력하지 않고 Enter키를 누르셨습니다.");
		}else {
			 System.out.println("변환된 숫자는" + convert);
		}
	}
	
	//필요할 경우 다음의 메서드 선언부분(메서드 시그너처)을 수정하시기 바랍니다.
	private static int convert(String str){
		
		
	}
}

  • Object 클래스 p360
  • 프로젝트 advanceJava 생성
    • api.lang 패키지
      • ObjectTest1 //Object클래스와 Object에서 상속받는 메소드들
      • Person
      • ObjectTest2 //hashCode와 equals 메소드
        • //hashCode는 객체를 정수값으로 변환하는 작업을 수행
          => 객체의 JVM에 할당되는 객체의 메모리 주소를 기반으로 정수값을 만든다.
          같은 데이터를 갖고 있는 p1과 p2지만 할당되는 메모리가 다르므로 hashCode가 달라진다.
          필드값이 같은 객체이면 HashCode도 같아야 한다.
          항상 hashCode를 오버라이딩해야 한다.
  • toString() 필수 = 기본 메소드
  • equals를 호출할때 내부적으로 해시코드 가지고 검사하고 equals 가지고 검사 (같은 문자열이어도 다른 해시코드를 가질 수도 있음.) = //JVM내부에서 hashCode로 먼저 검사를 하고 equals로 일치하는지 체크하는 경우가 많다.
person 
//매개변수로 전달되는 Object는 Person객체
	public boolean equals(Object obj) {
		//매개변수는 Object지만 Person이 실제 전달되므로 Person객체의 필드가 같은지 비교
		//obj가 타입이 Person인지 검사하고 Person으로 캐스팅을 한 후 비교
		if(this == obj) {
			return true;
		}
		if(obj == null) {
			return false;
		}
		if(obj instanceof Person) {
			//객체의 값을 비교해야 하므로 Person멤버필드를 액세스해야 한다.
			Person p = (Person)obj;
			//객체의 모든 값들을 비교
			if(this.name.equals(p.name) && this.equals(p.addr) && this.age == p.age) {
				return true;
			}
		}
		return false;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", addr=" + addr + ", age=" + age + "]";
	}

3시
예제 1 Object API 연습

  • 이해 못했음.

  • String 클래스 p. 377 String = 100명이 10개의 객체 = 1000개가 만들어짐

  • 예제 1 chap05.oop.basic.FinalTest

  • 예제 2 StringTest1 //String객체를 생성하는 방법과 비교

    • // - new 연산자를 이용해서 생성 : 문자열이 같아도 다른 객체로 인식
    • // - 리터럴로 생성(상수) : 문자열이 같으면 같은 객체로 인식
  • 예제 3 StringTest2 //String클래스의 중요한 메소드

    • \"합\ -> ""안에 또 "" 쓰고 싶을 때 저 기호와 함께 쓰면 됨
  • 예제 4 StringTest3 //String클래스의 중요한 메소드 - 2

    • //String 객체의 메소드를 실행해도 원본이 변경되지 않고 결과로 새로운 String객체가 만들어진다.
  • StringBuffer //무겁지만 동시접속에서 안전함

  • StringBuilder //가벼움

  • 예제 5 StringTest4 //String 클래스의 메소드를 이용해서 데이터를 변환

  • 플랫폼 만들기, hdc 플랫폼 만들기?

월요일 - 스트링 마무리 하고 라즈베리파이책 받고 파이썬

0개의 댓글