IT/java

Java 교육 Step1 (OOP,String, Console In/Out, 상속)

원창연 2022. 7. 14. 05:21

1. OOP 클래스 설계

    1.1 개별클래스 설계 

         

    1.1.1 Object(=객체) 

        객체 : 각 입장에서 바라보는 대상으로 속성 + 기능

         구체화 방법 : Object 모델링 즉 속성 + 기능으로 나눔

   1.1.2 Class

         Class : 객체를 Object 모델링(속성 + 기능)을 프로그램의 언어의 문법을 빌려 표현

                     속성 -> 변수, 상수

                     기능 -> 메서드   표현

    1.1.3 Instance 

          new라는 연산자를 통해 Class를 메모리에 올려 사용 

1.2 각 클래스 사이의 관계

     원칙 : 각 클래스를 코딩 할 때 클래스 내부에서 선언된 변수는클래스 내부의 메서드로만 핸들링한다.

    1.2.1 메시지 패싱(Message Passing)

             클래스간의 관계는 메서드의 호출로 제한한다

             ex) CarSale1 -> CarSel2(객체의 확장 현실반영) ->CarSel3(생성자)

            참고 : getTer setTer

   1.2.2. 객체지향은 현실세계를 반영한다

            한명에서 두명으로 늘어났다는 것은 "객체지향은 현실세계를 반영한다" 

   1.2.3 생성자

           - 클래스이름과 같은 메서드

           - 인스턴스 변수를 초기화하는 기능

           - 유일하게 메서드의 리턴 타입이 없음

           - 생성자 내부에서는 final로 선언된 상수의 초기화가 한번에 가능

 

           참고 :  지역<->전역 : 중괄호 안/밖
                       전역변수가 없음(단 static변수 : 전역변수 대체)

                       this 는 인스턴스 자기 자신을 가리키는 키워드 ==>파라메터는 임시발급임으로

 

1.2.4 인스턴스 변수의 직접접근 

          레퍼런스 변수. 변수  또는 레퍼런스변수.메서드()

 

1.2.5 정보의 은닉(Infomation Hiding)

           클래스 간의 관계는 메서드의 호출로 제한한다 = 클래스간의 관계를 메서드 호출로 강제한다 

            관련 : 접근제어  

 1.2.6 접근제어(Access Control Idenifier)

           private -> default(같은패키지) -> protected(같은패키지 + 다른패키지 속에 sub클래스) - > public 

 1.2.7 캡슐화(Encapsulation)

          연관성 있는 변수와 메서드를 하나의 클래스로 묶는거(입력과 출력이 고정, 코드변화를 최소화) 

          예제) 우주선

 

1.3 Static      

      정적 -> 공유

      - 프로그램 실행시 선언문은 한번만 실행

      - 소속되어 있는 클래스의 인스턴스 생성여부와 상관없이 스스로 메모리에 들어감

      - 레버변수 없이 클래스 변수로 접근  클래스변수.변수 또는 클래스 변수.메서드

   1.3.1 Statc 변수

   1.3.2 Static 클래스     

           스스로 메모리에 들어감. -> 인스턴스 생성이 없어서 코드 간결

           new 연산자를 사용하지 않음 - > 실행속도 빠름

           static 은 가비지 컬렉션(Garbage Collection) 대상이 아니므로 메모리 낭비가 있을수 있음

           static 메서드 사용시 메서드 내부에는 인스턴스 변수와 인스턴스 메서드의 호출을 할수 없음

 

    1.3.3 Static으로 만든 클래스 

          참고 :  100% static 변수 및 메서드로 사용  -> System, Math 클래스 대표(즉 라이브러리 성)

 

2. String 클래스

    1. String 클래스 

    1.1. String 클래스의 기본

            문자열은 인스턴스(new 없이 사용), 문자열은 상수 (같은값은 메모리가 동일)

            - "" 로 생성된 문자열 인스턴스의 주소를 레퍼런스 변수가 받는다 

            - 같은값이면 인스턴스의 주소를 복사한다.

            - 이는 문자열의 내용이 바뀔수 없기 때문에 문자열의 인스턴스는 상수이고 불변)

           참고) c언어는 시작pointer로 무한데 null까지 

        1.1.3 문자열 메서드 

                 substring : 주소값으로 시작부터

                 compareTo : 문자열 비교로 길이를 비교하지 않음

        1.1.4 클래스 현장에서 String 클래스 사용을 지양하자( 성능속도에 주범2-불변Immutable)

                  A + B                new + new 
                  AB + C                new + new
                     ABC + D           new + new 

               참고 : 가장느린 연산자 new    -> 가비지 컬렉션을 유발한다

               용어 : 가비지 콜렉션이란 메모리에는 떠있는데 사용(호출)하지 않는  주소를 말함

       1.2 StringBuilder & StringBuffer            

               StringBuilder -> Thread UnSafe
               StringBuffer  -> Thread Safe

               new 1번 생성후 출력시 String으로 new 1번

             ※  Thread의 정의 : 동시실행

 

3. Console Input & OutPut

      Console의 탄생 : 중앙시스템을 시분할방식으로 연결 더미 시스템이 모니터와 키보드만을 가지고 있을때

     참고 :  T(time)DMA - > C(code)DMA

         입출력의 태생    

구분 C Java 비고
입력 scanf Scanner Java는 Class로 시작
출력 printf printf(Java5)
println
printf 늦게 나옴

예제) System.out.println(class)  classpath@주소값 나옴

        주절이) public int chkID(int key1, int key2){   -> 지양 : 파라메터 해킹

                     VO(Value Object)  DTO(Data transfer Object)  태생 

        생성자 및 toString은 이클립스 도구를 사용하자

1. ConsoleOutput

   1.1 printf() && println() 

      println() : 해당 주소값에 toString() 메서드를 호출한다

 

  2. Console input      

    2.1 과거버전 콘솔출력  

package day1.pastconsole;

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class PastConsoleInput {

	public static void main(String[] args)
	{
		try {
			InputStreamReader isr=new InputStreamReader(System.in);
			BufferedReader br=new BufferedReader(isr);
			System.out.print("정수를 입력하세요: ");
			String str=br.readLine();
			int num=Integer.parseInt(str);
			System.out.println("입력된 정수는: "+num+"입니다");
		}catch(Exception ex){
			ex.printStackTrace();
		}
	}
}

 

   2.2 Scanner 클래스 

        간결하고 입력 장치에 영향을 주지 않음 -->  java가 class로 만든원인임

         Scanner 클래스에서 지원하는 장치에 대해 동일한 방법으로 사용하겠다

 

4. 상속(Inheritance)

     1. 개념정리 

      1.1 내용

             상속이란 상위(super) 클래스가 가지고 있는 변수와 메서드를 하위(sub)클래스에게 그대로 물려주는것을 의미

             상속이 코드 재활용?  ->CBD(Component Base Development) 

              UML관계표시 super <- sub 

       1.2 상속의 룰

              extends라는 키워드 사용              

            1.2.1 IS-A 관계

                   Truck is a Car  (O)   Car is a Truck(X)

            1.2.2 Has-A관계

                          1개까지는 어떻게

             1.2.3 Composite 관계 

                         Has-A 관계 보완 합성관계

                        참고 com.school 같은 클래스의 묶음

 

2. 다형성(Polymorphism)

            

            Overloading   :  1개의 클래스에서 여러개의 호출 파라메터 타입 갯수를 다르게

                                 Overloading 정의 : 그랜저 예시 2.4 3.0 X 생산년도별로  x 세대

                                  1개의 클래스에서 여러개 호출 파라메터 객체의 타입과 갯수 다르게

            Overridng : Super class것을 재정의 (메소드 이름, 파라메터 갯수타입, return 값 은 그대로 사용)

 

 2.1 메서드 오버라이딩(Overridng)  2개이상 클래스

        Overridng : Super class것을 재정의 (메소드 이름, 파라메터 갯수타입, return 값)

               1) 겹치는 소스사용가능

               2) 명시적 형번환 가능 super class 래퍼변수는 sub instance를 사용가능

               3) overridng된 메소는 형변환에서 제외된다.(body 재정의)

 

 2.2 상위 클래스의 레퍼런스 변수는 하위 클래스의 인스턴스를 참조할수 있다

       

상위클래스 레퍼런스 변수는 하위클레스의 인스턴스를 참조방법 예시

                       단. 오버라이딩 된 메서드는 형변환에서 제외가 된다

         ※  앞으로 super class로 레퍼변수를 사용하자

             장점 : 코드가 간결(메소드 하나), 라인수가 많아짐(함수증가), 메소드 이름 변경없음

  2.3 다형성(Polymorphism)

           클래스간의 관계에서는 메서드의 호출로 제한한다

          -> 상위클래스의 레퍼런스 변수로 하위클래스 인스턴스 참조가 가능하다.

          

           ==> 코드의 변화가 없다(동일하다) 

             다형성의 의미이미 사용법은 메서드 오로라이딩

                                            상위클래스의 레퍼런스 변수는 하위 클래스의 인스턴스를 참조 가능(상속으로)

           레퍼런스변수.메서드 했을때 결과가 다르게 나옴(상위클래스로 처리시)

 

        - 메서드 오버라이딩

        - 오버라이딩된 메서드는 형변환 대상에서 제외된다.

        - 상속을 통해 연관된 클래스들을 동일한 방식으로 접근한다.