190415_6일차 이클립스 설치, 접근지정(제한)자, 자기참조연산자, 인터페이스, final, 클래스와 인터페이스 간의 상속 문법


이클립스 설치

  • 1555290513997
  • https://www.eclipse.org/downloads/packages/
  • 우리는 Enterprise용으로 받는다~! // 밑에 있는 버전은 자바만 개발 가능하고, 위의 버전은 자바도 가능하고 HTML, JavaScript, Spring, Git 등이 사용 가능하기 때문에!
  • 첫 화면에서 다운 받으면 .exe 실행파일 되기 때문에, zip 파일 선호, 자칫 실행파일로 설치하면 개발 설정을 바꿀 수도 있기에…

  • 1555292175950

  • 작업공간 설정

  • 1555292331690

  • 1555292361723

  • Open Perspective 는 작업환경~, 기본적으로 제공하는 플러그인, 자바 프로젝트 하면 보통 Java와 Java EE를 사용

  • 자바 클래스 = 자바 빈, 아직 우리는 Java로 한다!

  • /*
         * 이클립스 단축 키 : 메뉴 window - Preferences - General - Keys
         * 
         * Ctrl + space : 자동완성
         * Ctrl + 1 : 제안기능
         * Ctrl + / : 한줄 주석 추가, 삭제
         * Ctrl + Alt + 아래 화살표 : 설택된 블럭을 복사하여 아래로 붙여넣기
         * Alt + 위 아래 화살표 : 선택된 블럭을 위 아래로 이동
         */
  • 나는 폰트는 cambria로~!

  • 패키지 이름 달리하면 병합 할때 좋다. 그래서 com.~~~ 이런식으로 이름을 구성한다!

  • 웬만하면 Refector - rename 은 하지 말자, 할거면 그냥 코드 복사해서 붙여 넣는 방법이 더 좋음, 왜? 이클립스가 좋은 부분 중 하나가 작성하고 저장하면 히스토리를 다 남김,

  • //package선언 : 현재 프로그램(클래스)의 위치 지정
    //형식 ) package 상위패키지명, 하위패키지명;

    //import 선언 : 현재 프로그램(클래스) 에서 사용할 외부 클래스의 위치 지정
    //형식 ) import 패키지명, 클래스명;

//지난 과제
package com.encore.$0415;

import java.io.IOException;

//package선언 : 현재 프로그램(클래스)의 위치 지정
//형식 ) package 상위패키지명, 하위패키지명;

//import 선언 : 현재 프로그램(클래스) 에서 사용할 외부 클래스의 위치 지정
//형식 ) import 패키지명, 클래스명;

public class MenuTest 
{
    public static void main( String[] args ) throws IOException 
    //System.in.read() 하면 에러가 발생할 수도 있는데 예외처리 안할래! 라는 의미.
    // 왜 IOException을 예외처리할까? 지난번엔 그냥 Exception 이었는데, 
    //추후에 배운다!
    {
        int num;
        int su = 0;// 증가 또는 감소한 값을 유지하기 위해 반복문 밖에 선언
        do
        {
        System.out.println( " < < 메 뉴 > > " );
        System.out.println( "1. 검색  2. 증가  3. 감소  4. 종료" );
        System.out.print( "번호를 입력하세요 ==>> " );
        num = System.in.read() - 48;
                     System.in.read(); // CR (13) 맨 앞으로 이동
                     System.in.read(); // LF (10) 줄 바꿈

        switch(num)
            {
            case 1 : System.out.println( "#검색 결과\n" + su); break;
            case 2 : su++; System.out.println( "#1증가"); break;
            case 3 : su--; System.out.println( "#1감소"); break;
            }
        System.out.println();
        }while( num != 4 );
        //자바에서 { } 는 영역가로 Scope , Body 라고 말함, 

        System.out.println( "-- END --" );
    }
}

<접근지정(제한)자 : AccessControl>

  • public
    • 서로 다른 패키지에서도 접근가능
  • protected

    • 서로 같은 패키지에서 접근가능, 만약 상속관계를 갖는다면 자식에서 부모를 참조할 수 있는 것.
  • default

    • 생략, 서로 같은 패키지에서 접근가능
  • private
    • 같은 클래스 내에서만 멤버끼리만 접근 가능
##p1패키지
class Parent
{
    public void m1(){}
    protected void m2(){}
    void m3(){}
    private void m4()P{} //m1, m2, m3 만 호출 가능 다른 패키지, 클래스에서 불가
}

class Child extends Parent
{
    // m1, m2, m3 접근 가능하나 m4에서는 접근 불가
}

================================
##p2패키지
class Child extends Parent
{
    //m1 접근 가능, m2 접근 가능(부자 관계이기 때문), m3 불가, m4 불가
}
================================
##p3패키지
class other
{
    //m1만 호출 가능, 같은 패키지도 아니며 부자 클래스 관계도 아니기 때문
}
  • 접근 지정자 위치

    1. 필드

      • [접근지정자 4개] 자료형 변수명;
    2. 메소드

      • [접근지정자 4개] 리턴자료형 메소드명(매개변수){}
    3. 클래스

      • [접근지정자 2개 (public , default 만 가능)] class 클래스명 {}
      • 클래스인데 만약 private가 된다면 그냥 쓰레기임…
  • 접근 지정자 뭐 해야 하는데 고민이라면 그냥 public 깔아두고 생각해보자,

직접 해보자!

//p1패키지

package p1;

//기준!! (서로 다른 접근 제한자를 갖는 메소드 정의)
public class Parent { 

        public void m1()
        {
            System.out.println("m1");
        }
        protected void m2()
        {
            System.out.println("m2");
        }
        void m3()
        {
            System.out.println("m3");
        }
        private void m4()
        {
            System.out.println("m4");
        }

}

package p1;

//자식에서 부모클래스의 메소드 호출
public class Child extends Parent{

    void callTest() {
        m1();
        m2();
        m3();
        //m4(); // 에러 The method m4() from the type Parent is not visible , 자식도 호출 불가
        //m5(); // 에러 The method m5() is undefined for the type Child
    }

}

package p1;

//자식에서 부모클래스의 메소드 호출
public class Other {

    void callTest() {
        //m1(); // 에러 The method m1() is undefined for the type Other
        //m2(); // 에러
        //m3(); // 에러
        //m4(); // 에러 The method m4() from the type Parent is not visible , 자식도 호출 불가
        //m5(); // 에러 The method m5() is undefined for the type Child

        Parent p = new Parent();
        p.m1();
        p.m2();
        p.m3();
        //p.m4(); // 에러 , The method m4() from the type Parent is not visible
    }

}
//p2 패키지
package p2;
//import 안하면 패키지 달라서 에러
import p1.Parent;

//자식에서 부모클래스의 메소드 호출
public class Child extends Parent{
    void callTest() {
        m1();
        m2(); //같은 패키지에서 접근 가능하다 하지만 상속관계인 부자 패키지 관계이면 패키지가 달라도 접근 가능!
        //m3(); // 에러, 디폴트는 패키지가 다르면 호출 불가
        //m4(); // 에러 The method m4() from the type Parent is not visible , 자식도 호출 불가
        //m5(); // 에러 The method m5() is undefined for the type Child
    }
}
//-------------------------
package p2;

import p1.Parent;

//자식에서 부모클래스의 메소드 호출
public class Other {
    void callTest() {
        //m1(); // 에러 The method m1() is undefined for the type Other
        //m2(); // 에러
        //m3(); // 에러
        //m4(); // 에러 The method m4() from the type Parent is not visible , 자식도 호출 불가
        //m5(); // 에러 The method m5() is undefined for the type Child

        Parent p = new Parent();
        p.m1(); // 왜 여기서는 에러가 발생하지 않은걸까요? public이기 때문~!
        //p.m2(); protected는 같은 패키지에서 접근 가능
        //p.m3(); 디폴트는 같은 패키지 내에서만 접근 가능
        //p.m4(); // 에러 , The method m4() from the type Parent is not visible
    }
}

자기 참조 연산자

  • 1반 홍길동, 2반 홍길동, 3반 홍길동 이 있는데 모두가 모인자리에서 특정 홍길동을 부를땐 2반 홍길동~! 이렇게 말해야 하지만, 2반 안에서 길동이를 찾을때는 굳이 그래야 하는 필요가 있을까? 보통은 생략하고 홍길동이라고 부른다 하지만 아래와 같은 경우에 사용한다!
  • 현재 클래스를 가르키는 레퍼런스 변수(참조변수)!
  • 보통은 생략

    1. 메소드 내에서 사용
    2. 객체 생성자내에서 다른 생성자를 호출시 사용
    3. 매개변수(지역변수)와 멤버변수(필드)를 구분하기 위해 멤버변수 앞에 this.을 붙여 사용.
//형식
this.필드명;
this.메솓명();
this(); //생성자 호출
//참고
super.필드명;
super.메소드명();
super(); //부모클래스 생성자 호출
  • 오른쪽 버튼 눌러서 - source - generate constructor using fields 로 쉽게 생성 가능

%생성자 만드는 단축키 컨 + 스 + 엔


인터페이스

  • 인터페이스는 메뉴판이다!, 유지보수하는데 이점이 있다.

    • 형식

    • “`java
      interface 인터페이스명
      {
      //필드
      [고정 public static final] int su;
      //여기서 static이란 new처럼 메모리 할당 할 수 있음
      //new는 동적메모리 할당, static은 정적 메모리 할당
      //여기서 final이란 마지막 변수라는 뜻, 절대 변하지 않는 수!

      //선언된 메소드
      [고정 public abstract] void print();
      //대괄호 생략 가능
      }

      
      - 저장 : 인터페이스명.java -> 컴파일 -> 인터페이스명.class
      
      - interface의 구성멤버는 필드, 선언된 메소드로만 구성
      
      - ```java
      void print()
      {
          //정의된 메소드, 구현된 메소드!
      }
      
      ///////////////////////선언된 메소드!
      void print(); // 기능 없이 이름만 선언된 메소드 ( 바디없는, 영역괄호 없는 메소드 )
      //단지 연결시켜준것, 메뉴판처럼 손님과 요리사를!

    < 손님의 입장 >

    • 서로 다른 제품에 연결할 수 있는 공통 연결 모듈을 의미.

    < 주방장의 입장 ( 객체를 생성하는 곳 ) >

    • 클래스에 다중 상속을 구현 할 수 있다.

    • ★ 인터페이스는 어떻게 사용? 클래스에 구현해서 사용!!

    • 구현 키워드 : implements

    • “`
      class 클래스명(//주방) implements(//구현의 약속) 인터페이스(//메뉴판)명
      {

    }
    “`

  • 실습

    package com.encore.$0415;
    
    public interface MenuPan 
    {
    // public static final 고정
    //final은 유지할 고정값을 명시해야 함
    
    
    //int coin; 에러 발생, 반드시 초기화 해야 함
    int coin = 500;
    /*public abstract 고정 생략*/void 짜장면();
    /*퍼블릭이 고정 생략*/abstract void 짬뽕(); //선언된 메소드 : abstract method
    public abstract void 볶음밥();
    }
    
    //============
    package com.encore.$0415;
    
    public class Hongkong implements MenuPan  //주방
    { 
    //implements : 구현의 약속
    @Override //어노테이션 JDK5버전 이후
    public void 짬뽕() 
    {
        System.out.println("매콤한 짬뽕");
    }
    @Override 
    public void 짜장면() 
    {
        System.out.println("달콤한 짜장면");  
    }
    @Override
    public void 볶음밥() 
    {
        System.out.println("갓볶은 볶음밥");  
    }
    public void 초밥() // 추가해도 상관 없다!
    {
        System.out.println("초밥 한입에 쏙~");
    }
    }
    
    //============
    package com.encore.$0415;
    
    public class InterfaceTest  //extedns String : 에러 발생
    {
    public static void main(String[] args) 
    {
        //손님
        MenuPan menu = new Hongkong(); 
        //인터페이스는 new 못씀
    
        menu.짬뽕();
        menu.짜장면();
        menu.볶음밥( );
    
        //static멤버는 클래스명으로 접근!!
        System.out.println("코인값 : " + MenuPan.coin);
    }
    }
    
    

Final

  1. final 자료형 변수명;

    • 마지막 변수 : 상수 (constant)
    • 상수의 식별을 위해 전체 대문자로 표기
    //예)
    final int max = 100;
    max++; >> 101 // 에러 발생!
  2. final 리턴형 메소드명 () {}

    • 마지막 메소드 : 오버라이딩(메소드 재정의) 할 수 없는 메소드.
  3. final class 클래스명{}

    • 마지막 클래스 : 클래스는 자식클래스를 통해 기능을 확장하는데, final 클래스는 무자식상팔자 클래스 : 자식 클래스를 갖지 않는 클래스
    • 완벽한 클래스(자식클래스 통한 기능확장을 원치 않는다.)
    • 보안적인 측면에서 사용하기도 함

<클래스와 인터페이스 간의 상속 문법>

class A{}

class B extends A //extends 뒤에는 상속 받고자 하는 한개의 클래스 명만 정의! 
{
    //extends 는 확장의 의미를 갖는다. 자식클래스를 확장 클래스라고도 함   
}
//============================================
interface A
{}
interface B
{}

class C implements A,B 
{}
//위와 대조하여 클래스는 무조건 한개의 클래스만 상속 가능하지만 interface는 , 를 사용하여 다중 인터페이스를 다중 상속 할 수 있다
// A와 B인터페이스 내의 선언된 메소드를 C클래스에서 전부 구현!, 구현의 약속!
//============================================
interface A{}
class B{}

//class C implements A extends B? 
// 얘는 에러가 발생함
//클래스와 인터페이스를 동시에 상속 할때에는 순서가 중요하다.
//클래스를 먼저 상속 받고 인터페이스는 나중에!
//implements가 먼저 나오면 컴파일러가 extends Object를 implements 키워드 앞에 추가해줌! 그래서 implements 가 두개가 되어버리는것... 에러!

class C extends B implements A // 로 해줘야 한다!
{

}

//============================================
interface A { void hello(); }
interface B { void hi(); }

interface C implements A,B {} 는 에러
interface C extends A,B {}
/*interface C extends A,B 
{
    void hello();
    void hi();

}
*/ //이렇게 기능을 가져오겠데...
//엥 이건 무슨 소리야?!
//A 안에는 hello(); 선언되어있음, hi();

//============================================
class A {void hello(){}}
interface B ㅁ A {} // 이런 경우는 절대 없다. 말이 안됨 extends는 내려준다라는 뜻인데 중괄호 있는 애를 어케 내려줌, 
// 주방을 물려받는 메뉴판은 없다.
  • mission

    package com.encore.$0415.misson;
    
    import java.io.IOException;
    
    /*
    * 기능정의
    * -단입력
    *    int inputDan ()
    * {
    *    int dan = read() 또는 readLine() 을 사용해서 받기 //그리고 단출력에 전달해야 함, return 타입 통해
    * }
    * 
    * -단출력
    *    void outputDan () 
    * {
    *    //전달받은 dan에 대한 출력
    * }
    * -계속여부
    *    char continueDan () 
    * {
    *    read() 또는 readLine()
    * }
    */
    
    public class Gugudan 
    {
    //public int dan;//=0
    //public char continuedan;//='\u0000'
    
    
    int inputDan() throws IOException
    {
        System.out.println("point");
        System.out.println("원하시는 단을 입력해주세요");
        int dan = System.in.read() - 48;
        System.in.read();
        System.in.read();
        return dan;
    
    }
    
    void outputDan(int dan)
    {
        System.out.println(dan + "단 구구단 출력");
        for (int i = 1; i <10; i++)
        {
            System.out.println(dan + "X" + i + " = " +  dan*i) ;
        }
    }
    
    char continueDan() throws IOException
    {
        System.out.println("계속하시겠습니까?");
        char continuedan = (char) (System.in.read());
        System.out.println(continuedan);
        System.in.read();
        System.in.read();
        return continuedan;
    
    }
    
    }
    
    
    //----------------
    
    package com.encore.$0415.misson;
    
    import java.io.IOException;
    
    /*
    * main() 포함
    * 반복적인 실행을 할 것(while 또는 do~while 사용 하면 됨)
    * 이번은 while로 해보자!
    * 반복문 내에서 Gugudan클래스 안에 3개의 메소드가 있는데 3개의 메소드들을 적당히 호출.
    */
    
    public class GugudanTest extends Gugudan
    {
    
    public static void main( String[] args) throws IOException
    {
        Gugudan g = new Gugudan(); 
    
    
        System.out.println("구구단");
    
        int dan = g.inputDan();
        g.outputDan(dan);
    
    //        
    //        g.inputDan();
    //        g.outputDan(dan);
    //        g.continueDan();
    //        
    
        while(g.continueDan() == 'y' )
        {
            dan = g.inputDan();
            g.outputDan(dan);
        }
            System.out.println("종료");
    }
    
    }
    
궁금상자
    - 패키지 이름 2개 이상 권장하는 이유?

    - jdbc

    - 어노테이션?

    - throw와 throws의 차이
        https://jhkim2017.wordpress.com/2017/04/24/java-throws%EC%99%80-throw%EC%9D%98-%EC%B0%A8%EC%9D%B4/
    - 자바 프로젝트 패키지 클래스 이해
        https://skyilcts.tistory.com/5
    - 패키지
        https://opentutorials.org/course/2517/14135
    - 인터패이스 패키지
        https://nittaku.tistory.com/46
        https://studymake.tistory.com/428
        https://opentutorials.org/module/2495/14142
    - 





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){} 가능한가?인자의 갯수도 같고, 타입도 같은데?

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

19044_4일차 자바의 입력,

자바의 입력

  • 프로그램 실행 도중 필요한 시점에 데이터를 입력받는 것.

  • 왜 필요할까?! => 변경되는 데이터를 소스프로그램 없이 외부에서 전달하기 위해 사용.

    (학점 구하기, 성별 구하기 등등…)

    1. byte 단위 입력

      • 숫자입력
      /*
      System.in.read();
      <hr />
      
      System.in : 표준입력 => 키보드 입력
      */
      int su = System.in.read() - 48;
      /*
      -48을 하지 않으면?
      int su =  System.in.read();
      키보드 입력     프로그램에서 받는 값
      0                   48
      1                   49
      5                   53
      
      이렇게 48이 더해져서 나온다...
      */
      • 문자입력
      /*
      (char)System.in.read();
      <hr />
      
      (char)를 앞에 붙여준다.
      키보드 입력     프로그램에서 받는 값
      a                   97
      b                   98
      A                   65
      9                   57
      
      자료형 = (기본자료형, 참조(클래스,사용자정의)자료형)
      (자료형)데이터
      <hr />
      
      캐스팅(casting) 연산자 : 형변환연산자!
      */
      int su = 300; double d = 3.14; 
      
      int su2 = 3.14; // 에러? => 발생
      su2 = (int)3.14; //3.14데이터를 int로 형변환 하겠음. 변환하고 나머지값을 버려버리겠다라고 명시하는 것.
      System.out.println(su2); // 3 나옴
      
      double d2 = 300; //에러? => 이상없음, 자동형변환 
      System.out.println(d2); // 300.0
      
      
      System.out.println(97); ==> 97 출력
      System.out.println( ( char ) 97 ); // 결과 a
      char ch = (char)System.in.read();
      */
      /*exception 에러 (unhandled, unreported)
      InputTest.java:9: error: unreported exception IOException; must be caught or declared to be thrown
      예외처리 해달랬는데 안했어, 방법은?
      */
      public static void main(String[] args) throws Exception
      //예외처리 하기
      
      class InputTest 
      {
      public static void main(String[] args) throws Exception 
      {
          System.out.println( "프로그램 실행도중 입력테스트 !" );
          System.out.println( 97 );
          System.out.println( ( char ) 97 );
      
          System.out.print( "한자리 수를 입력 : " );
          int su = System.in.read() - 48; // 입력받는 시점
          // 다시 3을 입력받고 싶다면 애래처럼 13 과 10처리 하기
          /*
              System.in.read();
              System.in.read();
          */
          System.out.print( "동일한 수를 다시 입력 : " );
          int su2 = System.in.read();
          int su3 = System.in.read();
      
          System.out.println( "당신이 입력한 값은 su = " + su + "아스키 코드는" + su2 );
          System.out.println( "10 나오나? = " + su3 );
      
          System.out.println( "===end===" );
      }
      }
      //엥? 왜 아스키코드는 13이 나오지? 3 입력하고 엔터를 입력해서 엔터의 아스키코드는 13임.
      //키보드 : 3   엔터
      //컴퓨터 : 51 13(CR) 10(LF)
      /*
      문제) 아래와 같이 실행하는 프로그램을 작성하시오(for문 사용)
      [실행결과]
      
      <3단>
      3 * 1 = 3
      ...
      3 * 9 = 27
      */
      
      class GugudanTest 
      {
      public static void main(String[] args) 
      {
          System.out.println( "<3단>" );
          for(int i = 1; i < 10; i++)
          {
              System.out.println( " 3 * " + i + " = " + ( 3 * i ) );
          }
      }
      }
      //미션 구구단!
      class GugudanTest 
      {
      public static void main(String[] args) 
      {
          for(int dan = 3; dan < 6; dan++)
          {
              System.out.println( "<" + dan + "단>" );
      
              for(int i = 1; i < 10; i++)
              {
                  System.out.println(  dan + " X " + i + " = " + ( 3 * i ) );
              }
      
              System.out.println( "\t" );
          }
      }
      }
      
      class GugudanTest4 
      {
      public static void main(String[] args) throws Exception
      {
          System.out.print( "시작단을 입력하세요 : " );
          int start = System.in.read() - 48;
          System.in.read();
          System.in.read();
          System.out.print( "끝단을 입력하세요 : " );
          int end = System.in.read() - 48;
          end++;
      
          for(int dan = start; dan < end; dan++)
          {
              System.out.println( "<" + dan + "단>" );
      
              for(int i = 1; i < 10; i++)
              {
                  System.out.println(  dan + " X " + i + " = " + ( 3 * i ) );
              }
      
              System.out.println( "\t" );
          }
      }
      }
    2. 라인단위 입력

    - 객체생성
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    
    - 문자열 입력
    String str = in.readLine(); // a b c d 엔터 ---> "abcd"
                            // 1 2 3 4 엔터 ---> "1234"
    str + 300 ? 1534(X) , "1234300"(이렇게 나옴)
    
    - 숫자입력 ( 위에서 입력된 값에 대해 사칙연산을 하고 싶다! )
    "" 큰 따옴표를 제거하자 ( 많이 쓰는 기능 )
    Integer.parseInt( str ) ; // parseInt();는 숫자로 구성된 문자열을 숫자로 변환하는 기능을 갖는다.
    su + 300 ? 1534 (0) 
    Integer.parseInt( "123" ); // 결과값 123
    import java.lang.*; //기본패키지 =>> 컴파일러가 자동으로 추가시켜줌! *=  모든것, 와일드카드가 뭐야?
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
        // 사용하겠음, 사용하고자 하는 클래스의 소속( 폴더 , 패키지 )를 알려주는 역할
       //형식) import 패키지명.클래스명;
       // 근데 왜 String은 그냥씀? =>> 자주 쓰는 기능들은 임포트하기 넘나 귀찮, 자바 기본패키지에 모아둠
    
    class LineInputTest 
    {
    public static void main(String[] args) throws Exception
    {
        BufferedReader in = new BufferedReader( new InputStreamReader( System.in) );
    
        System.out.println( "숫자를 입력? " );
        String str = in.readLine(); // 입력시점
        System.out.println( "STR = " + str );
        System.out.println( str + 500 ); // 123500
    
    
        //숫자문자열 ---- 변환 ----> 숫자 "123" ----> 123 ( 큰따옴표 제거 ) : parseInt( 숫자문자열 )
        int su = Integer.parseInt( str ); // Integer.parseInt("123") ---> 123
        System.out.println( su + 500 ); // 123 + 500 =>> 623
    
    
    
        /*
            <자바 I/O의 4대 클래스>
                        ㅣ       읽기      ㅣ   쓰기
                =======================================
                byte단위  ㅣ   InputStream ㅣ   OutputStream
                문자단위    ㅣ   Reader      ㅣ   Write
    
                클래스 모아둔것 = 패키지 , 윈도우 폴더처럼 
        */
    
    }
    }
    import java.util.Calendar;
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    
    class JuminBunhoTest 
    {
    public static void main(String[] args) throws Exception
    {
        //주민번호를 입력받아 화면에 나이를 출력하기!! (readLine()메소드사용)
        //"920306-1012345"
        // =>> 전체문자열에서 "92"만 추출하기 : String
    
        //나이계산하기?       92라는 숫자를 가져왓, 2019 - ( 1900 + 92 ) + 1
        //자바 날짜 관련된 클래스 : 대표적 2가지 Date, Calendar Date는 별로 잘 안씀
    
        Calendar cal = Calendar.getInstance(); //객체를 Instance, Object를 사용하는데 특정 클래스 하나를 표현할땐 Instance를 사용함
        //cal 변수안에 현 시스템의 모든 날짜관련정보가 저장됨.
        //cal.get( 얻고자 하는 세부정보);
        //java 사용 설명서 https://www.oracle.com/technetwork/java/api-141528.html
        //https://docs.oracle.com/javase/8/docs/api/
    
        int year = cal.get( Calendar.YEAR );
        System.out.println( "year = " + year );
    
        BufferedReader in = new BufferedReader( new InputStreamReader( System.in) );
        String id = in.readLine(); // "931025-2011111"
                            //인덱스     012345-
        String birthYear = id.substring( 0, 2 ); //"92"
    
        System.out.println(birthYear);
        int age = year - ( 1900 + Integer.parseInt( birthYear ) ) + 1;
    
        System.out.println( "당신의 나이는 " + age );
    }
    }
궁금상자
1. 왜 키보드 숫자 입력받을때 -48? 왜?... 2진코드 머시기 알아보자
    - 아스키코드때문, 아스키코드 공부 하기!
    https://commin.tistory.com/41

2. 키보드 숫자 입력 받을 때, int -48이지만 short byte도? 다를거 같은데

3. 자바의 유명한 에러 뭐가 있을까?!

4. 입력 read(); 와 Scanner 의 차이?!

5. 자바 와일드카드가 무엇?!

6. import 시 특정 클래스 기재 안하고 * 해버리면 안됨?

190410_3일차 조건문 이어서, 반복문

조건문

  1. if문

    • 형식 : if(조건식) // boolean 데이터!

      {

      ​ boolean데이터! //조건식의 결과가 참일때 실행할 문장;

      }

      class D
      {
      void hello( int su ) //int su = 1
      {
          if( su == 1 )
          {
          System.out.println( "안녕" );
          }
          if( su == 2 )
          {
          System.out.println( "신짜오" );
          }
          if( su == 3 )
          System.out.println( "Hello" );
      }
      }
      class IfTest 
      {
      public static void main(String[] args) 
      {
          D d = new D();
          int num = 2;
          d.hello( num );
      }
      }
  2. if~else문

    • 형식
    if(조건식)
    {
       //조건식의 결과가 참일때 실행할 문장;
    }else
    {
       //조건식의 결과가 거짓일때 실행할 문장;
    }
    • 주의

      else는 홀로 사용이 불가!!

      반드시 if(){} 이후에 입력되어야 함.

  3. switch~case문 (다중택일 조건문)

    • 형식
    switch(기준데이터)
    {
       case 비교데이터1 : 실행할문장1;
       case 비교데이터2 : 실행할문장2;
       case 비교데이터3 : 실행할문장3;
    }
    
    class SwitchTest
    {
    public static void main(String[] args) 
    {
        int su = 55;
        switch( su )
        {
            case 1 : System.out.println( "하이" );
                    break;
            case 2 : 
                    System.out.println( "신짜오" );
                    break;
            case 3 : System.out.println( "안녕" );
                    break;
            default : // 일치하는 값이 없을때, 실행 문장 표현
                    System.out.println( "잘못된 입력입니다." ); 
        }
    }
    }
    class SwitchTest
    {
    public static void main(String[] args) 
    {
        int jumsu = 105;
        int su = jumsu/10;
        switch (su)
        {
        case 10 : 
        case 9 : System.out.println( "A학점" );
                        break;
        case 8 : System.out.println( "B학점" );
                        break;
        case 7 : System.out.println( "C학점" );
                        break;
        case 6: System.out.println( "D학점" );
                        break;
        default : System.out.println( "F학점." );
        }
    }
    }
    • java의 제어문 break와 continue가 있다.

    • break가 없다면 switch입력값에 해당하는 명령부터 끝까지 실행해버린다.

    • 제어문 break!! (수식의 데이터 값 : 정수(byte, short, int), … )

      • switch블럭, 반복문 블럭 내에서 사용.
      • break를 감싸는 불럭을 벗어나는 역할.
  4. if~else if~else문

    • 서로 연결된 조건식을 표현할 때 사용, 필터링, 수의 범위표현
    • 형식
    if( 조건식 )
    {
       //조건식1이 참일때 실행할 문장;
    }
    else if( 조건식2 )
    {
       //조건식1이 거짓이고, 조건식2가 참일때 실행할 문장;
    }
    else if( 조건식3 )
    {
       //조건식1,2가 거짓이고 조건식3이 참일때 실행할 문장;
    }else
    {
       //조건식1,2,3이 차례대로 거짓일때, 실행할 문장;
    }
class 클래스명
{
    //변수선언
    int su;
    boolean flag;
    double d;

    String str;
    A obj;

    //메소드 정의
    리턴형 메소드명( )
    {
        // 변수선언 int min;
        // 변수초기화 su = 300; min = 0;
        // 메소드호출 System.out.println("안녕");
        // 조건문 if(조건식) { }
        // 반복문
        6;
        for( ) {7;}
        8;
        9;
    } //메소드
} //클래스

<반복문> Loop

  1. for문

    • 일정횟수 반복할 때 사용
    • 규칙적인 수를 표현할 때 사용
    • 배열의 인덱스를 표현할 때 사용

    [형식]

    for( 초기화; 조건식; 증감연산자 )
    {
    //반복적으로 실행할 문장;
    }
    
    =>> 실행순서)
        초기화 -> 조건식 -> 실행문 ->증감연산자
              -> 조건식 -> 실행문 ->증감연산자
              -> 조건식 -> 실행문 ->증감연산자
              -> false -> for문 탈출!
    
    for(int i = 0; i < 5; i++)
    {
    System.out.println( "안녕" )    
    }
    
    class ForTestTest 
    {
    public static void main(String[] args) 
    {
        A a = new A();
    
        a.one(0);
        a.two(0);
        a.three(0);
        a.four(0);
        a.five(0);
    }
    }
    
    class A
    {
    void one( int i )
    {
        for( i = 1; i < 6; i++)
        {
            System.out.println(i);
        }
        System.out.println("=====");
    }
    
    void two( int i )
    {
        for( i = 1; i < 6; i++)
        {
            System.out.print( i + " " );
        }
        System.out.println();
        System.out.println("=====");
    }
    
    void three( int i )
    {
        for( i = 5; i > 0; i--)
        {
            System.out.print(i+ " ");
        }
        System.out.println();
        System.out.println("=====");
    }
    
    void four( int i )
    {
        for( i = 3; i < 13; i+=3)
        {
            System.out.print(i+ " ");
        }
        System.out.println();
        System.out.println("=====");
    }
    
    void five( int i )
    {
        System.out.print("[");
        for( i = 5; i <= 20; i+=5)
        {           
                System.out.print( " " + i );
    
                if(i<16)
                    System.out.print(",");
        }
        System.out.print(" ]");
    }
    }
  2. while문

    • 조건이 참인동안 반복실행

    • 조건이 만족되지 않는다면 한번도 실행되지 않을 수 있고 조건이 만족된다면 언제든 쓰일 수 있다.

    • 실행횟수 0 ~ 무한대 (if문의 경우 0또는 1)

    • 반복되는 횟수가 일정치 않을 때 사용

    • 서버의 리스너를 표현할때 =>> 무한 반복할 때

    • 형식

      while(조건식)
      {
       //조건식의 결과가 참인 동안 
      }
      class WhileTest
      {
      public static void main (String[] args)
      {
          int i = 1;
          int sum = 0;
          while(i < 11) //무한 루프, 반복
          {
              sum+=i;
              i++;
      
          }
          System.out.println("1부터 10까지 더한 값은 " + sum);
          }
      }
  3. do ~ while문

    • while문과 동일

    • 차이점 : 조건식의 결과와 상관 없이 무조건 한번은 실행한다, 실행횟수 : 1 ~ 무한대

    • [형식]

      do
      {
      반복실행할 문장
      }while(조건식); //세미콜론 무조건 달아줘야 한다 주의할 것!!!!!!!!!!!!!!!!
      
      class DoWhileTest 
      {
      public static void main(String[] args) 
      {
          //문제) "Hello World"를 화면에 3번 출력하시오.(단, do~while이라는 반복문을 사용)
      
          boolean flag = true;
      
          int count = 1;
          do
          {
              System.out.println("진푸 풍덩~!");
          //벗어날 수 있는 방법 두가지 여기서는 flag를 false로 바꿔주거나 break;
              if(count++ == 3)
              {
                  break; //flag = false;
              }
          }
          while (flag);
      
          //1부터 10까지의 합을 출력하시오 (do~while사용)
          int su = 1, sum = 0;
      
          do
          {
              sum += su;
              if(su < 10)
              {
                  su++;
                  continue;
              }
              flag = false;
          }while (flag);
          System.out.println(sum);
      }
      }
      
      //예시가 좋은 문제는 아니다.

<제어문>

  1. break문
    • switch블럭 또는 loop블럭(for, while, do~while)내에서 사용하며 해당 영역을 빠져나가는 역할.
    • 사용 : break;
  2. continue문
    • 반드시 loop영역내에서만 사용
    • loop영역의 끝괄호 역할
    • for : 증감자 => 조건식
    • while : 조건식
    • do~while : 조건식
    • 사용 : continue;
나의 궁금점 Q!
- if, else할때 실행문이 한줄일 때 영역괄호(스코프) 하는게 좋을까 안하는게 좋을까?
    검색 안됨, 모르겠다, 근데 하는게 좋지 않을까? 한줄짜리 긴 코드를 스코프 안에 넣어놔야 나중에 좋을거 같다는 막연한 생각이 든다.

- 변수 % 2 == 0이 좋을까 변수 % 2 != 1 이 좋을까?
    https://ict-nroo.tistory.com/11
    위의 링크의 글을 참조하니 위의 방법보다는 변수&1 = 1이면 홀수, 0이면 짝수의 방식이 더    빠르고 좋은 방식이라고 생각된다.
- case 뒤에는 상수만 들어갈 수 있다! 상수만 들어간다면 문제가 없다.
    final int j = 4; //변수면 에러남, 반드시 상수
    switch(i)
        case j :

- break마지막에 안해도 되지만 메모리 리소스 먹는거 아닌가?!
    리소스를 더 먹는 등의 문제는 없는거 같은데 유지보수 측면에서 나중에 추가할수도 있으니 웬만하면 추가 하는게 좋은것 같다.
https://stackoverflow.com/questions/2729813/switch-statements-do-you-need-the-last-break-javascript-mainly

- case문에 long은 왜 안될까?
    자바8 버전부터 String은 된다!
- case문에 조건에는 뭐가 들어갈 수 있을까?
    byte, short, int 확인 완료 short은 안된다.
- if문과 switch문 속도와 효율은?
    조건문이 4개 이하이면 if, else if가 좋지만
    조건은이 5개 이상이라면 switch case문이 더 효율이 좋다.
- for문 안에 if while문 안에 if 등 중첩시 문제?! 효율?!
    중첩되면 좋을리는 없다, 연산횟수의 증가로 효율을 감소시키고 에일리언코드가 되버릴 수 있다.
- 반복조건에 
- do~while에 대해서 어떤경우에 유용한지
    do while은 어셈블리 언어로 변환하면 forwhile보다 jump연산이 1개 적게 쓰여서 조금 빠르다고 함. 하지만 do while의 경우 하단에 조건이 위치되어 있어서 가독성이 안좋아서 논리를 꼬아버릴수도 있음.최초 1회 보장하려고 굳이 써야 할지는 모르겠음.

1일차

오라클 JDK 설치

https://www.oracle.com/downloads/

jdk란? 자바 개발 도구, 컴파일러 등이 들어 있다. JDK안에 JRE들어있음 JRE란? 컴파일 된 자바 프로그램을 실행시킬 수 있는 자바 환경을 만드는 것 자바 프로그램을 실행시키려면 JRE 반드시 설치할 것

3가지 구분됨

  • JDK 자바개발도구

    • SE(데스크탑 위에 실행, 계산기 그림판 등) - 기본적인 기능 모두 포함되어있기에 Android개발할때도 사용

    • EE(서버측)

    • ME(모바일, 임베디드쪽)


  • JRE도 설치된다. 웹브라우저에서 쓰는 자바

  • JDK위치설정(bin, lib)

  • lib는 도서관, 자바도서관이라고 할 수 있다, 기본 단위 클래스들이 들어가 있음.

![1554688584166](C:\Users\Playdata\Documents\K\1554688584166.png)

![1554688785146](C:\Users\Playdata\Documents\K\1554688785146.png)

명령어들 위치 지정

![1554688899043](C:\Users\Playdata\Documents\K\1554688899043.png)

가장 위에 올려주자!

![1554688980911](C:\Users\Playdata\Documents\K\1554688980911.png)

.은 현재 디렉토리 의미

환경변수 설정하고 나서 cmd로 확인

![1554689170656](C:\Users\Playdata\Documents\K\1554689170656.png)

이렇게 뜨면 잘 설치된 것.

<프로그램 작성>

메모장으로!

![1554690230108](C:\Users\Playdata\Documents\K\1554690230108.png)

![1554690219167](C:\Users\Playdata\Documents\K\1554690219167.png)

인스톨한 JDK에는 JVM이 딸려있다.


소스코드 - javac 통해 - 이진코드로 변환 이를 - java 가 실행

저장파일은 반드시 첫줄class 뒤의 이름으로 해줘야한다

명령어 실행 javac 컴파일하고자 하는 자바파일명(.java확장자 포함) ----> javac HelloTest.java

바이트코드(HelloTest.class)실행 ---> Source File은 자바JVM(자바가상머신)이 읽을 수 없으므로 반드시 컴파일 과정을 거쳐 ByteCode File로 변환시켜야 함.

인터프리터 HelloTest.class ------Interpreter(java.exe)-------> JVM위에서 실행 명령어 실행) java 실행하고자 하는 자바파일명(.class확장자 포함하지 않음!!) ----> java HelloTest

JAVA Source(.java) -> JAVA Compiler(javac) 통해서 -> Java Byte Code(.class) -> JVM(JAVA Virtual Machine)

Java Source (확장자 .java) 인 파일을 JAVA Compiler 통해 JAVA Byte Code로 컴파일 함

컴파일 된 바이트 코드를 Class Loader(JVM)에 전달

클래스로더는 Dynamic Loading을 통해 필요한 클래스들을 로딩 및 링크하여 Runtime Data area(JVM의 Memory)에 올림

Execution Engine은 JVM메모리 올라온 바이트코드들을 '명령어 단위'로 가져와서 실행

*JVM 동작 원리에 대해서는 이 포스트에 엄청 자세히 나와있음!

<https://steady-snail.tistory.com/67>

  • Class Loader

    • 여러 클래스 로더끼리 부모 자식 관계의 계층적 구조

    • 3가지 원칙

      • 위임 : 클래스 로딩 작업을 상위 클래스로더로

      • 가시 범위 : 하위 클래스로더는 상위 클래스로더 로딩 클래스 볼 수 있지만 반대는 불가

      • 유일성 : 상위 클래스로더가 로딩한 클래스를 다시 로딩하지 않게 유일성 보장

  • Runtime Data Area

    • JVM이 OS위에서 실행되며 할당받는 메모리 영역

  • Execution Engine

    • 바이트 코드를 명령어 단위로 읽어서 실행

JAVA는 interpreter 언어이면서 complier 언어

  • 인터프리터는 고급언어를 한줄씩 번역해서 기계어로 번역하는것

  • 컴파일러는 고급언어 프로그램을 목적프로그램으로 번역 후 링킹 작업 통해 실행 프로그램 생성하는것

  • 자바는 javac 로 컴파일 하고, java로 실행시 중간언어를 한줄씩 자바 인터프리터가 번역하므로 컴파일언어 이면서 인터프리터 언어다!

왜 둘 중 하나 선택 안하고 병행하는건가?

  • 기계어로 컴파일러 하면 매우 효율적

  • 하지만 컴파일러는 기계 종류에 종속적

  • 병행하여 인터프리팅 함으로서 플랫폼에 종속되지 않는다.

  • 자바 바이트 코드는 컴퓨터와 프로그램 사이에 버퍼역할을 한다.(보안적으로 장점)


메모장 실행해보자

public class HelloTest { public static void main(String [ ]args) { System.out.println("안녕 자바~!"); } }

![1554692364114](C:\Users\Playdata\Documents\K\1554692364114.png)

짠!

이제 editplus 툴을 사용해보자~!

<https://www.editplus.com/kr/download.html>

![1554693297342](C:\Users\Playdata\Documents\K\1554693297342.png)

요래 생김~!

![1554693619853](C:\Users\Playdata\Documents\K\1554693619853.png)

![1554693747944](C:\Users\Playdata\Documents\K\1554693747944.png)

도구 설정


프로그래밍을 잘 하려면

  1. 프로그램의 구성요소

    • 필드(field)

      • 변수라는 용어와 혼용해서 사용

      • 데이터 속성, 자료구조, 데이터를 담는 그릇

    • 메소드(method)

      • 함수

      • 기능, 행위

    • 클래스(class)

      • 자바프로그램 기본단위(파일)

      • 필드와 메소드를 담는 울타리(template)

  1. 구성요소 구분

    • 변수, 필드

      • 첫글자 소문자

      • 단어 뒤에 ()소괄호 포함 X

    • 메소드

      • 첫글자 소문자

      • 단어 뒤에 ()소괄호 포함O

    • 클래스

      • 첫글자 대문자

    • ex) System.out.print("하이");

      • System = 클래스

      • out = 변수,필드

      • print() = 메소드

        • 이건 약속이고 관례니 지키자!

  2. 구성요소 형식

    *식별자(Identifier) 이름 규칙(변수명, 메소드명, 클래스명에 적용)

    1. 첫글자 숫자 불가능

      • cup1, cup2 ( O )

      • 1cup, 2cup ( 에러 발생)

    2. 특수문자 사용불가

      • cup@ cup% (불가)

      • 예외) _와 $는 사용 가능

        • String name;

        • String studentName;

        • String student_name;

    1. 한글사용 가능 => 자바는 유니코드(16bit)를 지원하기 때문에 가능

      • String 학생이름; (가능), 하지만 가독성때문에 지양할 것

    1. 예약어 사용 금지 (에러발생)//예약어란 프로그램 내에서 이미 의미와 용법이 지정되어 사용되는 단어

      • int class; (안됨)

      • int public; (안됨)

      • int if; (안됨)


      enum(이늄)

      enum이 뭐지? ...

      클래스?... 상수?... 배열?...


      *자바 자료형(DataType)

      => 기본 자료형 8개 + 클래스자료형(알파, 대문자로 시작하는) 1개

      • 문자 : **char**

        char ch; // 변수 선언 : ch변수에 문자데이터를 받겠음

        ch = 'a'; // 변수 초기화 ( 값을 할당 )

        ch = '가';

        ch = '3';

        ch = '길동'; (X) // 작은 따옴표에는 두개 이상의 문자가 올 수 없다.

        **String** str = "길동"; // 문자열 (문자의 나열 : 0 개 이상의 문자를 표현할 때 사용)

         

      • 숫자

        • 정수

          • **byte** : (1byte)

            • 1byte == 8bit == 2의 8승 == 256개 ( -128 ~ 0 ~ 127 )

            • byte b;

              • b = -128;

              • b = 127;

              • b = 0;

              • b = 128; (에러)

              • b = -129; (에러)

          • **short** : (2byte)

            • 2의 16승

          • **int** : (4byte)

            • 가장 많이 사용

          • **long** : (8byte)

        • 실수

          • **float** : (4byte)

          • **double** : (8byte)

            • 많이 사용

            • double d = 3.14;

      • 논리 : **boolean** (반복문, 제어문과 함께 많이 사용)

        • false과 true로만 표현 (자바는 0과 1 안된데...)

          • boolean b1;

          • b1 = true;

          • b1 = false;

          • b1 = 'true'; (에러)

          • b1 = "false"; (에러)


    short과 int와 long

    • 8비트에서는 short int, 32비트에서는 long int로 처리하는것이 빠르다.

    • 64비트라면 8byte쓰는게 빠를거 같지만 아니다. 4byte가 빠르다.

    • 64비트에서는 short보다 int가 빠르다.

    • 그렇다고 모든것을 int로 하면 메모리 낭비가 심각 할수도 있다.

    float과 double

    실수형 오차 발생 이유

    • 변수

      • 형식) 자료형 + "(공백)" + 변수명 + ;

        -> 변수선언!!

        커피 v1;

        물 v2;


    char , byte, short, int , long, float, double, boolean, String

    • 메소드★

      • 형식)

        리턴자료형 메소드명 ( 매개변수 )

        {//메소드 시작

         

        }//메소드 끝

        ===> 매개변수의 다른 용어 : 인수, 인자, argument, parameter

        void gildong ( ) //void는 자료형 아닌데... -> 가져올 데이터 없음, 주는게 없네 ()에 넣어줘 { 1. 문앞으로 이동; 2. 문열기; 3. 자기자리로 되돌아 오기; return; //생략가능 }Coffee lime ( ) { 1. 자판기 앞으로 이동; 2. 동전투입; 3. 커피버튼클릭; 4. 커피를 뽑아서 되돌아오기; return 커피; //생략 불가 }Cola juwon ( int coin ) { 1. 자판기 앞으로 이동; 2. 동전투입; 3. 콜라버튼클릭; 4. 콜라를 뽑아서 되돌아오기; return 콜라; //생략 불가 } //밖에 있는 데이터가 int coin 통해 주원에게 들어옴 그럼 1,2,3,4를 하겠다는 뜻, 이 결과가 Cola를 통해 빠져나감

        매소드는 이렇게 나열임, 순차적으로 진행하고 되돌아온다. 이름을 불러줘야 실행됨.

    • 클래스

      형식)

      class 클래스명 {//클래스 시작 }//클래스 끝
      • class, 클래스명, 클래스 내용 이렇게 3개만 있으면 된다.

      class My { //변수 선언 int su; //메소드 정의 void hello() { } }
  • 진주의 질문타임

애기가 아까 선언하자마자 초기화 하면 안돼? 이래짜나

int su (선언)

su = 3 (초기화)

이거 말고

int su = 3 (선언과 함께 초기화) 이케

가능한데 이게 경우마다 조금씩 다르게 쓰여

예를 들어서 만약에 이 전체를 다 dan = 5 로 한다면

선언과 함께 초기화를 쓰면 되는거야

하지만 *1 *2 는 dan이 5였으면 좋겠고 * 3은 dan이 6이었으면 좋겠고 *4 *5 는 dan이 8이었으면 좋겠어

이럴수 있겠지?

근데 선언과 함께 초기화를 하면

그 밑에

선언은 한번만 할수 있어

선언은 오직 한번만!

이건 최적화가 안되서

결론은 선언과 함께 초기화는 지금 배우는 입장에서는 아무렇게나 사용해도 됩니다.

하지만 시간이 갈수록 선언은 제각각 하는 경우가 생길텐데... 이왕이면 선언과 초기화를 따로 하는게 좋아요

int x;

x = 5;

이건 5를 x에다가 넣어라 라는 뜻이고

x == 5는 x랑 5랑 같다 라는 뜻이야

==이거는 if문쓸때 나중에

int x = 1;

if(x==5)

{

}

이런식으로 조건문 안에 x랑 y랑 같으면 밑에를 실행해줘 이렇게 쓰이는거야

만약에 x가 5이면 조건문을 실행해라 이렇게는 쓰이지 이러면 조건문

x = 5 이거는

x == 5 물어보는거야 ===개?

int x = 5;

double y = 5;

x == y 같음 이렇게 결과가 나오는데

x===y 안같음 이렇게 나와.

x=5 같다생각하면

== 같아?

같은고야?

같다 가 아니라 같아아?

ERP의 발달과정

- 1970년대 MRP에서 시작 MRP는 단순 재고 줄일 목적

- 1980년대 MRP2는 자재뿐만 아니라 생산에 필요로 하는 모든 자원을 관리. 확대, 원가절감

- 1990년대 확장. ERP개발, 생산뿐만 아니라 인사, 회계, 재무, 영업등 경영관점으로 확대, 경영혁신

- 2000년대 CRM, SCM등의 개념이 추가된 확장형 ERP로 발전, 기업간 협업(최적화), win-win-win

*CRM은 고객관계관리, SCM은 공급망 관리


MRP 

자재수급관리, 재고의 최소화 

MRP2 

제조자원관리, 원가절감 

ERP 

전사적자원관리, BPR(경영혁신) 

확장형 ERP 

기업간 최적화, e-비지니스 



ERP 도입의 필요성

- 조직과 업무가 IT로 통합, 모든 정보를 통합 처리

- ERP 패키지 내에 Best Practice라는 선진 프로세스 적용, BPR 자동 수행

- 충분한 확장성, 비용 절약

도입목적 

고객만족 이윤 극대화 

 

 도입방법

단계별 도입 

일괄 도입 

*선진 업무프로세스 = 모범 업무 프로세스로 이미 구성되어 도입시 능률 극대화

*업무 프로세스 재설계(BPR) = 기존 업무 혁명적 재계획 실천 평가



HTML

<!-- 범위 주석 -->


CSS

/* 범위 주석 */


Javascript

/* 범위 주석 */

//주석


Java

/* 범위 주석 */

//주석


Oracle

--주석


Mysql

# 주석

/* 범위 주석 */


왜 주석은 통일하지 못하는걸까?

예를들면 HTML 에서 /* 따로 할당된 명령어가 있는걸까?

고급언어로 작성된 프로그램을 실행하는 데에는 두가지 방법이 있다.


1.컴파일러는

컴퓨터가 직접이해하는 언어로 바꾸어주는 일을하는 프로그램

고급 명령어를 직접 기계어로 번역


2.인터프리터는

한번에 변환하는 컴파일러와 달리 한 단계씩 기계어로 해석하며 실행.

고급명령어들을 중간 형태로 번역 한 뒤 그것을 실행

인터프리터를 이용하면 대화식으로 할 수 있기에 학습용으로 많이 사용 (파이썬에서 사용했던!)


두개의 세부적인 차이로는


번역 단위

컴파일러는 전체단위로    

인터프리터는 한줄씩 번역


실행속도

컴파일러는 빠름

인터프리터 느림


번역속도

컴파일러는 느림

인터프리터 빠름


메모리 할당과 목적프로그램 생성은 컴파일러만

'Coding Study' 카테고리의 다른 글

프로젝트 기획과 관리? 무엇일까?  (0) 2019.06.13
언어별 주석달기  (0) 2018.09.12
프로그래머 역량 체크  (0) 2018.07.11
비밀의 언어
국내도서
저자 : 사이먼 싱(SIMON SINGH) / 이현경역
출판 : 인사이트 2015.12.06
상세보기


비밀의 언어 / 사이먼 싱 / 인사이트


2018-2 학기 암호학과 보안이론수업에 도움이 될법한 책


저자가 서문에 기재한 집필의 목적은 두가지이다.


첫째, '암호 코드의 진화과정을 기록하는 것'

둘째, '암호가 왜 과거 어느 때보다 오늘날 우리의 삶과 더 밀접하게 연관되어 있는가를 설명하는것'


저자가 이러한 두가지를 강조하며 이 책을 집필하였기에 나도 이 두가지점에 중점을 두어 이 책을 읽어 나아가려 한다.


---




+ Recent posts