클라우드 기반 웹 개발자 과정 공부/JAVA

190412 Day5 Escape Character, printf, OOP, 오버라이딩, 오버로딩, 생성자

용진용진 2019. 4. 12. 19:35





190412 5일차 Escape Character,printf, OOP, 오버라이딩, 오버로딩, 생성자





class GugudanPrintTest2 

{

    public static void main(String[] args) 

    {

        System.out.println("Hello World!");

        for(int i = 1; i < 10; i++)

        { //반복문 for 규칙적인 수, 바깥for문 : 기준 (고정)

            for(int dan=2; dan < 10; dan++)

            {

                System.out.print( dan + " X " + i + " = " + (dan*i) + "   ");

                //공백(WhiteSpace) : 한개 이상의 스페이스(한칸), 탭(일정간격), 엔터의 조합

                System.out.println();

        } 



        /*

        <Escape Character> Escape Sequence

        -특수문자, 확장문자

        -기능을 갖는 확장된 문자

        -주의 : 인용부호내에서만 사용해야 함, 인용부호는 작은따옴표 큰따옴표를 말함

        \n : new line, Line Feed(LF), 줄바꿈

        \r : Carriage Return(CR), 커서의 위치를 맨 앞으로 이동.

        \t : Tab, 일정간격 띄우기

        \\ : '\'문자표현

        \" : 큰따옴표

        \' : 작은따옴표

        */

    }

    }



 

  •  



자바 OOP(Object Oriented Programming)



<객체지향의 특징>



 

    1. 캡슐화 : 필드와 메소드를 묶어주는 것



        • 정보은닉

      • 모듈성

 

    1. 상속 ★



        • 부모가 갖는 자원( 필드, 메소드 )을 아낌없이 물려주는 것


        • 관련 키워드



          • extends


          예시



          class My extends 상속받고싶은 부모클래스명
          
          {
          
             //extends 는 is a 관계를 갖는다.
          
          }


          class Parent extends Object //import java.Object 과 같음 , 컴파일러가 자동 추가
          
          {
          
          
          
          }
          
          
          
          class Child exdends Parent
          
          {
          
          
          
          }
          
          /* 
          
          질문)
          
          Parent p = new Child();
          
          Child c = new Parent();
          
          이렇게 하려면, 에러가 발생하고 하나는 실행되는데 그건 
          
          Parent p = new Child();
          
          자식은 부모다, 자식은 언제든 부모가 될 수 있다, 하지만 부모는 자식이 될 수 없다.
          
          자바의 자식은 불효자!, 
          
          
          
          
          
          */

        • 단일상속이 기본 원칙.


      • API문서( Application Programming Interface )



        =>>



        java.lang.Object   //부모클래스, 상위 클래스 super class



        |



        +– java.lang.String     //자식클래스, 하위 클래스, sub class



        ※Object 클래스 =>> 최상위 클래스

 

    1. 다형성 ★★



        • 메소드 오버라이딩(MethodOverriding) ★★ =>> 메소드 재정의



          부모가 갖는 메소드를 울타리처럼 가져오는게 상속인데 그걸 자식이 재정의 할 때




          혹은 기존기능은 그대로 덧붙이는것


          상속에서 나온 개념, 상속과 연관




          부모가 갖는 메소드를 자식클래스에서 재정의



      • 메소드 오버로딩


        동일한 하나의 클래스에 동일한 이름의 메소드를 여러개 구현 




        ​  ( 단, 인자의 갯수가 다르거나 자료형이 달라야 한다.)



        매개변수의 개수 또는 타입이 달라야 한다.



        매개변수는 같고 리턴타입이 다르다고 오버로딩이 성립하지 않는다.



        class A
        
        {
        
         void hello() 
        
         {
        
        
        
         }
        
         void hello()
        
         {
        
            //에러 발생
        
         }
        
        }


        class A
        
        {
        
         void hello() 
        
         {
        
            System.out.println("안녕")
        
         }
        
         void hello(String name)
        
         {
        
            System.out.println("안녕," + name + " !! ")
        
              //인자 name을 쓰기 때문에 사용 가능!
        
         }
        
        }


        class Parent // extens Object가 생략된것
        
        {
        
         int x = 100;
        
         void hello()
        
         {
        
        
        
         }
        
        }
        
        class Child extends Parent
        
        {
        
         int y = 200;
        
         void goodbye()
        
         {
        
        
        
         }
        
        }
        
        
        
        /*
        
        1. Parent p = new Parent(); //new 는 동적 메모리 할당
        
        new가 Parent(); 오른쪽으로 감 , p는 Parent 왼쪽으로 감
        
        메모리 : 페어런트, 오브젝트
        
        2. Child c = new Child();
        
        child(); 에 new로 메모리 할당
        
        c는 chile에 대해서 참조
        
        메모리 : 차일드, 페어런트, 오브젝트 
        
        3. Parent p2 = new Child(); 
        
        또는 Parent p2 = c; // c는 2번에 있던 c , 위 아래는 같은 식이다.
        
        
        
        int su = 33;
        
        A a = new A();
        
        a. hello(); // 이거랑
        
        new A().hello(); //는 같은것임
        
        하지만 이렇게 같은데 다르게 쓰는 이유는 new는 계속 메모리를 할당하기 때문에 2번이상 나온다면 a. 을 사용하는게 더 좋음
        
        
        
        Parent p2 = new Child();
        
        앞뒤로 달랐을때
        
        p2 는 parent 참조, new는 메모리 할당
        
        
        
        p2.hello(); 는 parent 참조하기에 에러 안남
        
        p2.toString(); 도 Object에 있기에 에러 안남
        
        p2.goodBye(); 는 에러, 메모리는 할당되어있으나 참조가 Parent로 되어 있기에...
        
        
        
        부모 참조 변수를 통해 자식 호출 불가!
        
        반대로 자식 참조 변수를 통해 부모 호출 가능!(메소드 호출말하는 것)
        
        
        
        4. Child c2 = new Parent(); // 부자는 가능하지만 자부는 안된다!
        
        new Parent 하면 메모리에는 Object와 Parent가 할당 되는데 Child를 참조한다고?! 메모리에 없어 에러!
        
        
        
        Child c2 = p2; //에러
        
        Child c2 = (Child)p2; //는 에러 아님, 캐스팅(형변환)
        
        
        
        Child c3 = (Child)new Parent(); //컴파일때는 에러 안나지만 실행할때 에러
        
        부 = 자 아니면 안된다 대부분...
        
        */
        
        
        
        class Parent // extens Object가 생략된것
        
        {
        
         int x = 100;
        
         void hello()
        
         {
        
                System.out.println("신짜오");
        
         }
        
        }
        
        class Child extends Parent
        
        {
        
         int y = 200;
        
         void goodbye()
        
         {
        
            void hello()
        
             {
        
                System.out.println("신짜오");
        
             }
        
         }
        
        }
        
        /*
        
        p2.hello() 실행하면 신짜오가 실행된다. 
        
        오버라이딩 메소드만 자식클래스 메소드 호출 가능!
        
        무조건 위를 참조하지만 오직 오버라이딩만! 자식클래스 메소드를 호출한다.
        
        다형성!
        
        */


        //컴파일러가 import java.lang.*; 추가
        
        
        
        class Parent // extends Object 추가
        
        {
        
        int i = 11;
        
        void hello()
        
        {
        
            System.out.println("부모 안녕!");
        
        }
        
        void print()
        
        {
        
            System.out.println("부모 프린트~!");
        
        }
        
        void hello(String name) // ----> ? 오버로딩 메소드 ( 메소드명 같고 인자의 갯수 또는 자료형이 다른것)
        
        {
        
            System.out.println("부모 안녕! 스트링" + name);
        
        }
        
        void print(int age)
        
        {
        
            System.out.println("부모 안녕! 인트" + age );
        
        }
        
        
        
        }
        
        
        
        class Child extends Parent
        
        { // is a 관계 =>> 자식은 부모다!
        
        //         =>> 자식클래스는 부모클래스로 형변환이 가능하다!!
        
        int j = 22;
        
        
        
        void goodbye()
        
        {
        
            System.out.println("자식 안녕히가세요");
        
        }
        
        
        
        void print() //오버라이딩
        
        {
        
            System.out.println("자식 프린트~!");
        
        }
        
        }
        
        
        
        class InheritanceTest 
        
        {
        
        public static void main(String[] args) 
        
        {
        
            Parent p = new Parent(); //메모리 할당 : O P 
        
                            //참조별수                  p
        
            Child c = new Child();
        
            System.out.println( " j " + c.j);
        
            //부모            자식
        
            //Parent p = new Child(); //에러발생, 호환이 되지 않는 자료형, 변환할수 없습니다 에러 => extends Parent
        
            //---       ----------
        
            //기준        변환가능한지 여부?
        
        
        
            //c.abc();  에러 child, parent, Object 클래스에 순차적으로 확인후 존재하지 않기 때문에 에러
        
            c.toString(); // Object클래스에 toString(); 메소드가 정의 되어 이씩에 에러 발생 안함.
        
        
        
            System.out.println( "=================" );
        
        
        
        
        
            //자기 자신의 자원 호출
        
            p.hello();
        
            System.out.println( "=================" );
        
        
        
            //p.print();
        
            //p.goodbye(); 에러발생
        
            //기본 : 부모참조변수(p)를 통해 자식 접근 불가능! but 오버라이딩 했다면 접근 가능 오직 이것만!
        
        
        
            System.out.println( "=================" );
        
        
        
            Parent p2 = new Child(); // 메모리 할당 : O   P   C
        
            //----      -----------     //참조 변수 :     p2
        
            //기준        변환 가능 여부?
        
        
        
            p2.hello();
        
            p2.print(); // 기본원칙 : 부모참조 통해 자식 호출 불가!
        
                        // ★ 예외! 오버라이딩의 메소드의 경우에는 호출 가능~
        
                        //      =>> 정확히
        
                        //      =>> 오버라이딩 메소드가 존재한다면, 부모의 메소드는 은폐되고 자식의 메소드로 대체된다.
        
            System.out.print( p2.i); // i는 변수임으로 그냥 부모 변수 가져감, 오버라이딩은 오직 메소드에 대한 것임.
        
        
        
        }
        
        }
        
        

 





<생성자>  Constructor



 

    • 새로운 객체를 생성하기 위해서 초기화해주는 메소드



        1. 생성자의 이름은 반드시 클래스명과 일치( 대소문자 일치 )

        1. 리턴자료형을 명시하지 않는다. (void조차 명시하면 안된다.) 

          • 1번, 2번이 일반 메소드와의 차이점

        1. 객체 생성시 자동으로 호출

      1. 클래스내에 생성자가 하나도 없다면 자바컴파일러가 컴파일시 ( 기본생성자를 )자동으로 추가.

 



※주의 ) 만약, 클래스내에 한개 이상의 생성자가 정의 되어 있다면 컴파일러는 소스코드에 관여하지 않는다.





class Abc

{

    int su;

    My my;



    Abc( ) //기본생성자(매개변수 비어있는 생성자);  이름 클래스와 일치, 자료형 리턴자료형 없어야 한다. 

    {

        //=>>초기화 (값 할당) 메소드

        // 멤버작업에 대한 초기화 작업

        su = 10;

        my = new My();



        //(일반메소드 호출 전 1번 실행 하야 하는) 선행작업은 여기에 넣기.



    }//생성자



    Abc( ) //또 메소드 같은거 쓰면 에러

    {    

    }



    Abc( String name ) //오버로딩 생성자

    { 

    }



    ABc( int age ) //컴파일 에러 발생 : 클래스명과 일치하지 않으므로 일반메소드!, 리턴자료형을 명시하지 않았음! 이라고 에러가 남

    {



    }



    void hello()

    {



    } 

}/*class Abc();

==================

    Abc a = new Abc( );

    a.hello(); 기본 생성자 호출

    */

    a.hello();

    /*

    Abc a2 = new Abc( "길동" )

    ====== 오버로딩 생성자 호출!

    */

a2.hello();





class Abc

{

    int su; //멤버변수(필드) - 여러 메소드가 공유할 데이터를 표현, 기본값이 존재 O

            //기본값 =>> 정수:0 실수:0.0 논리:false 클래스:null



    Abc() //기본생성자

    {

        System.out.println("Abc기본생성자"); //먼저 시작됨!

    }



    Abc(String name)

    {

        System.out.println( "Abc오버로딩생성자" );

    }

    void hello()

    {

        int min; //지역변수 - 현재 메소드에서만 사용할 데이터를 표현, 기본값이 존재 X

            //min = 0; 지역변수는 반드시 초기화 해서 사용!

        System.out.println( "초콜릿 안녕" );

    }

} //class Abc



class ConstructorTest 

{

    public static void main(String[] args) 

    {

        Abc a = new Abc();

        // 1. 메모리 할당 2. 생성자 호출

        a.hello();

        System.out.println( "" ) ;      

    }

}



//하지만 우리가 생성자 만드는 일은 드물다, 하지만 생성자를 알아야 그것에 많게 객체생성을 할 수 있기에 우리는 배웠다.





궁금상자 

- 한개의 글자가 스페이스 한칸을 의미하는가?...

    구구단할때 스페이스로 했지만, 다른것에서는 문자 숫자 합쳐 나올텐데...

    그리고 의아한게 \t은 스페이스 4칸인데 한자리수 뒤도 4칸 두자리수 뒤도 4칸이면 라인이 깨져야 하는거 아닌가?



- print println printf 밖에도 다른?! printf 에서 f의 의미

    printf 의 f의 의미는 format string 이다. 서식화된 출력이라는 뜻







- 오버로딩은 if같은거 아닌가? 인수가 들어오면, 인수 포함된 메소드 들어오고 아니면 인수 없는 메소드 시작하고

    오버로딩 사용 하지 않으면, 이름 다 제각각 지어줘야 하고(int일때, float일때, double일때), 메소드명만 봤을때 메소드들이 같은 기능을 하는지 모를 수 있다. 하지만 오버로딩 사용하면 메소드 이름이 같으니 같은 기능이구나! 알 수 있고 이름도 안지어도 된다!

    https://java.ihoney.pe.kr/99



- Parameter(인자, 매개변수), Argument(인수)

    Parameter는 함수 선언에 사용되는 입력 변수

    Argument는 함수 호출에 사용하는 입력 변수



- 자바의 인자와 매개 변수의 차이점

    인자는 함수를 호출할때 값을 전달하는 것 1, 2, 5 int func(b)의 b처럼

    매개변수는 함수 내에서 전달 된 값을 받아 들이는 변수 int a나 int b처럼

    https://yangyag.tistory.com/24



    선생님께 인자 인수 매개변수를 다시 한번 여쭤보자



- 오버로딩에서 hello(int a){} hello(int b){} 가능한가?인자의 갯수도 같고, 타입도 같은데?

    응 안됨, 인자 갯수가 다르거나 타입이 달라야 한다.