190415 Day7 this, interface, mission, 배열, 자바빈즈, 추상클래스

복습

System.out.println(); 에서 out은 필드인데 어떻게 메소드인 println()을 포함하고 있지?

  • out은 PrintSteam이라는 메소드로 정의되어 있음 PrintStream out; 이렇게

명시하는 this

  • this는 보통 생략하지만 명시할 때도 있다. 생성자가 두개 있을 때

  • public class Abc
    {
      int su;
    
      public Abc()
      {
    
      }
    
      public Abc(int su)
      {
          su = su;
      }
    
      public void hello()
      {
    
      }
    }
    
    /*
    객체생성1
    abc a = new Abc();
    System.out.println(a.su);
    -> 이렇게 하면 0 출력됨
    
    객체생성2
    Abc a = new Abc(500); // 2번생성자 호출
    System.out.println(a.su);
    -> 이렇게 하면 0이 나옴, su = su는 지역변수에 500을 넣어라가 되어버림
    -> 500이 나오게끔 하고 싶다면 멤버와 지역변수의 이름을 다르게 한다 -> 하지만 이런 경우는 많이 없다. 연관성 주기 위해 이름 같게 함 보통, 그래서 this.su = su 이렇게 명시하면 된다.
    -> Abc(){this(100);} 을 넣어주면 Abc(int su)에 su 값에 100을 넣어주게 된다. 
    
    */

interface

  • 객체를 연결해주는 매개체, 메뉴판 같은, 손님과 주방장을 이어주는!

  • //내가 만든 것
    
    class A implements Common
    {
      void hello()
      {
          System.out.print("신짜오")
      }
    }
    
    //이미 Commmon에는 hello()가 정의되어있다.
    /*
    Common c;
    c = new A();
    c.hello();
    */
    
    class implements Common
    {
      void hello()
      {
          System.out.print("봉쥬르");
      }
    }
    
    /*
    c = new B();
    c.hello();
    */
    
    Common이라는 interface를 통해서 AB 클래스를 필요할때마다 쓴다
    느슨한 관계!

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("원하시는 단을 입력해주세요");
        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("종료");
    }

}
//선생님이 설명해주시는 것
//MyTest.java

public class MyTest {

    public static void main(String[] args) {
        My my = new My();
        You you = new You();

        int su = my.juwon();
        you.lime(su);

    }

}
//My.java

public class My {

    int su; // 멤버변수, 필드 ==> 클래스내의 메소드들이 공유할 데이터

    public int juwon()
    {
        //발생되는 데이터
        su = 300;
        //발생된 데이터 주기 =>> 리턴
        return su;
    }




}

class You
{
    public void lime(int su)
    {
        System.out.println("su = " + su);
    }
}
package A0416;

public class MethodCallTest 
{
    public static void main(String[] args) {
        A a = new A();

        a.hello();

        //메인 메소드 실행 중 발생 데이터 : 100
        int su = 100;
        String name = "나길동";
        String name2 = "길라임";
        int age = 15;

        //m1()메소드에게 su를 전달
        a.m1(su);//메소드 호출 () 소괄호 안에 데이터를 표시
        a.m2(name); // 메소드 호출 시 ㅌ데이터를 전달 할 수 있다.

        //데이터 두개 : 15,"길라임" => m3에게 전달
        a.m3(name2, age);

        //String name2라는 변수는 m3에 전달되지 않음
        //name2가 담고 있는 데이터(value) "길라임"만 전달!

        //---------------
        int i = 10;
        int j = 20;
        int k = 30;
        // m4()메소드에게 정수값 10, 20, 30 전달!
        a.m4(i, j, k);


    } //main

}

//A.java
package A0416;

public class A {
    //메소드 정의!

    public void hello()
    {
        System.out.println("A클래스 안녕~!");
    }

    public void m1()
    {

    }

    public void m1(int su)
    {
        System.out.println("m1() : " + su );
    }

    public void m2(String name) 
    {
        //main()메소드에 a.m2("나길동"); 실행되면
        //m2()에서는 String name = "나길동";이 가장 먼저 실행되어집니다.
        System.out.println("m2() : " + name);
    }

    public void m3(String name2, int age) {
        System.out.println("m3() : " + name2 + ", " + age);

    }

    public void m4(int su1, int su2, int su3) {
        System.out.println(su1 + ", " + su2 + ", " + su3);

    }


}

배열

  • 데이터형이 동일한 자료에 같은 (하나의) 변수명을 정의한 자료들의 집합.

    ​ ——————-복수 데이터

  • 데이터형이 동일한 자료 ==>> 조건

  • 같은(하나의) 변수명을 정의 ==>> 특성

  • 자료들의 집합 ==>> 정의

  • -
11 22 33
ture false true
“길동” “라임” “주원”
‘j’ ‘a’ ‘v’

- int su1 =11; int su2 = 22; int3 =33;

  • int [ ] su = { 11, 22, 33 }; =>> su라는 배열변수에 복수 데이터를 대입!

  • 배열은 왜 쓸까?!

    • 그냥 나열하면 되는데…
    • 관리가 편하다!
    • but, 문제가 있다 구분이 안가… 그래서 구분을 만들었어!
    • 실제 {} 안에는 구분이 있음 {ㅁㅁㅁ} 이렇게!
    • 자바에서는 배열은 객체
    • su[]는 전체 데이터 su[0], su[1] , su[2] 는 각각의 데이터
    • 데이터를 구분하기 위해서 사용 =>> su라는 배열변수에 복수 데이터를 대입!
  • int su; =>> 한개의 데이터 입력

  • int []su; =>> 여러개의 데이터 입력 (배열)

  • boolean [ ] b = { true , false, true };

  • String [ ] str = { “길동”, “라임”, “주원” };
  • char []ch = { ‘j’, ‘a’, ‘v’, ‘a’ };

  • 데이터를 구분하기 위해서 번지를 사용

  • 시작번지는 항상 0번지부터 시작!
  • 첫번째 데이터 부터 인덱스(자동번호)가 부여
  • 인덱스는 0부터 시작해서 1부터 증가
  • 배열의 크기가 정해지면 인덱스를 벗어나는 참조를 하면 안됨
  • int [] su3 = {10, 20, 30};
  • 번지 =>> 0 1 2
  • System.out.println( su3[1] ); // 데이터 사용 (두번째 데이터 출력)
  • System.out.println( su3[3] ); // 하면 에러 발생 ArrayIndexOutOfBoundsException

  • for는 규칙적인 수 반복 할때, 배열과 친하다!


자바빈즈

  • 서로 관련성 있는 속성을 묶어주는 클래스(객체)

  • 사용하는 곳에 따라 VO(ValueObject) 또는 DTO(Data Transfer Object) 라는 이름을 사용하기도 함.

  • 사용하고자 하는 속성들을 규칙 약속함! - 개발자들끼리

  • 규칙)

    1. 속성데이터를 private하게 선언
    2. public 선언된 주고 받는 메소드 (get, set)를 정의

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

    1. public한 기본생성자, 오버로딩 생성자를 정의 할 수 있다.
    2. 반드시 속성의 수와 일치하는 get, set이 정의되지 않아도 됩니다.
  • 참고)

    1. get으로 시작되는 메소드들 : 게터(getter)메소드
    2. set으로 시작하는 메소드들 : 세터(setter)메소드
    3. public한 기본생성자, 오버로딩생성자 정의 할 수 있다.
  • public class Person 
    { 
      private String name; 
      private int age; 
      private String job; 
    
      public Person(){}
        public Person (String name, int age, String job)
      {
          this.name = name;
          this.age = age;
          this.job = job;
      }
    
    
          public void setName(String name) //main에 있는 홍길동 받아옴
          {
              this.name = name;
          }
          public void setAge()
          {
              this.age = age;
          }
          public String getName()
          {
              return name; // this. 생략
          }
          public String getJob()
          {
              return job; // this. 생략
          }
    
    }
    //private 붙이면 쓰레긴데?!
    
    //===main===
    Person p = new Person();
    p.name = "홍길동"; //=>> 이름 정보 주기(설정) : 에러발생
    p.setName("홍길동") //=>> 실행 OK
    //system.out.println(p.name); //=>> 이름정보를 받기(얻기) private없다면 "홍길동 출력"
    System.out.println( p.getName() );
    //but, Person class에 private String name; 을 해버리면 에러가 난다!
  •  
  • public class Person { String name; int age; String job; }

    •  

alt + shift + s 통해서 getter setter 자동 생성!

ctrl + shift +enter 기본생성자 생성!

필드값도 생성하자!

1555387690155

매개변수와 get는 같지만 방향성이 조금 다른것일 뿐


추상클래스

  • 후손 class를 제어할 목적으로 사용.
  • 객체화 될 수 없는 클래스
  • 구현(정의)된 메소드와 선언된 메소드로 구성
  • 스스로 객체생성 불가 ( new 사용 X ), 후손class 객체생성(지식은 부모다)해서 사용
class 기본클래스
{
    //정의(구현)된 메소드
    void hello(){}
}

//---

class 추상클래스
{
    //선언된 메소드, 정의된 메소드
    void hello();
    void goodBye(){}
}

//---

interface 인터페이스
{
    //선언된 메소드만!
    void hello(){};
}
//추상 클래스 형식
abstract class 클래스명
{
    //필드선언
    public void hello(){}//구현된(정의된) 메소드
    abstract void print(): // 선언된 메소드(abstract 붙여줘야해)
}
  • 주의!
    • 선언된 메소드를 사용하는 경우 반드시 abstract 명시!
    • 만약 abstract 미기재시에는 에러 발생!
궁금상자
- 배열에서 시작은 0인데 바꿀 수 없나? 그리고 순서가 +1이 아니라 +2 씩 증가하게 할 수 없나?

- 배열은 타입이 같아야 하는데 만약 문자 숫자 배열 두개를 매번 교차로 출력하고 싶다면 그냥 for문 써서 하나씩 해야 하나?
    선생님이 설명해주심 바로,,ㅋㅋ 숫자를 문자로 형변환 후!

- super(); ? 빼도 된다구?

- 매개변수와 getter

- 자바 ioc?

+ Recent posts