Java:: 구성- 정보은닉(incapsulation),getter/setter 사용하기

정보은닉이 적용된 클래스에서 정보를 저장하고 꺼내오는 첫번째 방법

 

Person 클래스 안에있는 멤버변수들이 private 가 되지 않으면 다른 클래스 안에서

쉽게 가져와서 사용이 가능하지만 보안에 취약함

public class Ex02GetterSetter {
  public static void main(String[] args) {
    Person p1 = new Person();
    //속성에 private을 붙이면 외부에서 접근불가
    p1.id = "admin";
    p1.pass = "1234";
    p1.pass = "1111";
  }
}

class Person {
   String name;
   String id;
   String pass;
   String moblie;
}

 

private를 하게 되면 외부에서 접근이 불가능 하기 때문에 보안은 강화 되지만 

접근이 되지 않아서 에러가 발생함

그래서 getter/setter 함수를 만들어서 데이터를 가지고 오고 데이터를 저장해주어야함

package p03_method;

public class Ex02GetterSetter {
  public static void main(String[] args) {
    Person p1 = new Person();
    //속성에 private을 붙이면 외부에서 접근불가
    //p1.id = "admin";
    //p1.pass = "1234";
    //p1.pass = "1111";

    p1.setName("JSP");
    p1.setId("admin");
    p1.setPass("11111");
    p1.setMoblie("010-3446-7374");
    p1.PrintData();
    System.out.println(p1.getName());
  }
}

//incapsulation
class Person {
  private String name;
  private String id;
  private String pass;
  private String moblie;

  //사람이라는 틀을 만들어준 것
  public String getName() {
    return name;
  }
  public void setName(String name){
    this.name = name;
  }
  public String getId() {
    return id;
  }
  public void setId(String id){
    this.id = id;
  }
  public String getPass() {
    return pass;
  }
  public void setPass(String pass){
    this.pass = pass;
  }
  public String getMoblie() {
    return moblie;
  }
  public void setMoblie(String moblie){
    this.moblie = moblie;
  }
  public void PrintData(){
    System.out.println(this.name);
    System.out.println(this.id);
    System.out.println(this.pass);
    System.out.println(this.moblie);
  }
}

 

매서드 오버로딩(Overloading)

 

같은 클래스 안에서 이름이 같음

리턴타입은 상관없음

매개변수의 타입(type)과 순서가 달라야함

 

기본 생성자

etc-image-0

 

클래스 명과 동일한 메소드를 기본 생성자라고 함


    JVM에 의해서 기본적으로 생성되어 있음

getter/setter의 공통점은 '멤버변수 초기화' 하는것

차이점은 '시점'의 차이이다 

package p03_method;

public class Ex03Constructor {
  public static void main(String[] args) {
    Car gv70 = new Car(); //인스턴스를 만들면서 초기화 됨 
    // 기본 생성자로 인해서 Black으로 기본값이 출력됨
    System.out.println(gv70.getColor());
  }
}
class Car{
  public Car(){
    //클래스 명과 동일한 메소드를 기본 생성자라고 함
    //JVM에 의해서 기본적으로 생성되어 있음
    model ="gv70";
    color ="black";
    maker="HD";
  }
  private String model;
  private String color;
  private String maker;

  public String getModel() {
    return model;
  }

  public void setModel(String model) {
    this.model = model;
  }

  public String getColor() {
    return color;
  }

  public void setColor(String color) {
    this.color = color;
  }

  public String getMaker() {
    return maker;
  }

  public void setMaker(String maker) {
    this.maker = maker;
  }
}

 

1) 생성자는 없어도 기본 생성자가 자동으로 생성
2) 생성자는 new에 의해서 인스턴스를 생성
    3) 생성자도 Overloading이 된다
   4) 사용자가 생성자를 등록하면 기본 생성자는 자동추가 안됨

etc-image-1

생성자 안에 매개변수를 입력할 경우, 에러가 생김

이유는 기본생성자가 사라져서 그럼

에러를 없애기 위해서는 생성자 인스턴스안에 초기화할 값을 입력 해주어야함

etc-image-2

this 는 자신이 속한 클래스 .자신이 속한 멤버변수(속성)

class Car{
  public Car(){
    //this 는 자신이 속한 클래스 
    this("gv80", "white", "hd");
  }
  public Car(String model, String color, String maker){
    this.model =model;
    this.color =color;
    this.maker=maker;
  }
}

etc-image-3etc-image-4
this는 항상위에 올라와야함

public class Ex03ConstructorA {
  public static void main(String[] args) {
    Employee e1 = new Employee();
    Employee e2 = new Employee();
  }
}

class Employee {
  //초기화 블럭
  {
    System.out.println("Initial Block instance");
  }
  static {
    System.out.println("Initial Block static");
  }
}

static은 초기에 한번 올라가고 다시 출력되지 않음

instance 초기화 객체는 인스턴스 생성 할때 마다 생김

etc-image-5


 

class 가 참조형 변수라서 인스턴스를 가져왔을때 값을 그대로 가져오는게 아닌 

데이터의 주소값을 가져옴

package p03_method;

public class Ex04CallByValue {
  public static void main(String[] args) {
    String st; //선언만 할 경우,인스턴스가 참조형 변수의 구조만 설정됨
//    System.out.println(st); //초기화가 이루이지지 않아서 에러(Error)
    String str = "Hello";
    System.out.println(str);
    // 초기화가 이루어지지 않아서 주소값이 나옴 p03_method.Data@3b07d329
    Data data = new Data();
    System.out.println(data);
  }
}
class Data{
  int value;
}
    String st; //선언만 할 경우,인스턴스가 참조형 변수의 구조만 설정됨
    //System.out.println(st); //초기화가 이루이지지 않아서 에러(Error)
String str = "Hello";
System.out.println(str);

etc-image-6

package p03_method;

public class Ex04CallByValue {
  public static void main(String[] args) {
    Data data = new Data();
    data.value =100;
    change(500);
    System.out.println(data.value);
  }
  //값을 받는것
  static void change(int value){
    value = 1000;
  }
}
class Data{
  int value;
}

chang(500)의 값을 넣어 value =500이 되었다가 value 가 1000이 될 것 같지만

해당 값은 지역변수로만 사용하기 때문에 data.value 의 값이 변하지는 않는다

etc-image-7

data 인스턴스의 value의 값을 바꾸기 위해서는 참조형 변수의 값 자체를 받아서

변환 해주어야 한다

public class Ex04CallByValue {
  public static void main(String[] args) {
    Data data = new Data();
    change(data);
    System.out.println(data.value);
  }
  //참조형 변수를 받는 것
  static void change(Data data){
    data.value = 1000;
    System.out.println("change: "+data); //주소값 출력 change: p03_method.Data@682a0b20
  }
}
//class 가 참조형 변수라서 인스턴스를 가져왔을때 주소값을 가져옴
class Data{
  int value;
}

data라는 참조형 변수(주소값)을 넘겨주고

넘긴 data(주소).value 안에 1000을 넣어준다는 의미가 됨

etc-image-8

    change(500); //18번 라인 호출
    change(data); //data 라는 참조형 변수를 넘겨줌 /22번 라인 호출
    change(data.value); //data 변수 값을 넘겨줌 /18번 라인 호출

etc-image-9


메서드의 가변 인자

etc-image-10etc-image-11
인자가 1개인 경우
etc-image-12etc-image-13
인자가 2개인 경우
etc-image-14etc-image-15
인자가 3개인 경우

package p03_method;

public class Ex05multiarguments {
  public static void main(String[] args) {
  MultiArguments ma = new MultiArguments();
  ma.add(1,2,3);
  }
}

class MultiArguments {
  public void add(int n1) {
    System.out.println("one");
  }
  public void add(int n1, int n2) {
    System.out.println("two");
  }
  public void add(int n1, int n2, int n3) {
    System.out.println("three");
  }
  public void add(int[] n) {
    System.out.println("four");
  }
}

etc-image-16etc-image-17
인자가 많은 경우, 배열 or ...

public void add(int[] n) {
  System.out.println("four");
}
public void add(int n1, int ... n) {
  System.out.println("...");
}
//생략 가능
public void add(int ... n) {
    System.out.println("...");
}
//에러
//  public void add(int ... n, int n1) {
//    System.out.println("...");
//  }

 

public class Ex05multiarguments {
  //메서드의 가변 인자
  public static void main(String[] args) {
  MultiArguments ma = new MultiArguments();
  //여러개의 데이터를 받을 수 있음
  ma.add(new Data(), new Data(), new Data(), new Data());

  }
}
class MultiArguments {
  public  void add(Data ... data){
  }
}

연산자(operator)

System.out.println("사칙 연산자 + - * /");
System.out.println("나머지 연산자 %");

 

System.out.println("증감 연산자 ++ --");
int a =1;
System.out.printf("a = %d \n",a);
System.out.printf("a++ = %d , ++a = %d \n",a++ , ++a);

etc-image-18

public class Ex06operator {
    System.out.println("증감 연산자(단항) ++ --");
   
    int a =1;
    System.out.printf("a = %d \n",a);
    System.out.printf("a++ = %d , ++a = %d \n",a++ , ++a);

    a =1;
    System.out.printf("a++ : %d %d %d %d %d \n", a++,a++,a++,a++,a++);
    System.out.printf("++a : %d %d %d %d %d \n", ++a,++a,++a,++a,++a);

    a=1;
    int s=  a++ + a++ + ++a; // 1 + 2 + 4
    System.out.printf("s : %d\n",s);
  }
}

etc-image-19

 

System.out.println("대입 연산자 += , -= , *=, /=, %= ");
a+=1;  //a = a + 1
a-=1; //a = a - 1
System.out.println("a : "+a);

a-=1+s; // a = a-(1+s);
System.out.println("a : "+a);

a= 1;
a *= 2+a; //a = a*(2+a);
System.out.println("a : "+a);

etc-image-20

 

System.out.println("비교 연산자 >,>=,<,<=,!=,==");
System.out.println(100>10); //true ;false;

 

System.out.println("논리 연산자 ||(논리합),&&(논리곱),!(NOT),XOR(베타적논리합)");
System.out.println(10 > 2 && 2 >10);

 

System.out.println("shift 연산자 >> , << ");
a = 2;
System.out.println(a<<2); // 2진수로 변환후, 왼쪽으로 2번 옮김

 

System.out.println("bit 연산자 |,&,^,~");
System.out.println(2 | 1);
System.out.println(2 | 1);
System.out.println(2 & 3);
System.out.println(2 ^ 1);
System.out.println(~1);

etc-image-21

System.out.println("삼항 연산자 x?a:b");
System.out.println("a:"+a+(a>0?" 양수 ":" 음수 "));
System.out.println("a:"+(a =-1)+(a>0?" 양수 ":" 음수 "));

etc-image-22


 

package p03_method;

import java.util.Scanner;

public class Ex07condition {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    System.out.print("숫자 입력: ");
    int input = sc.nextInt();
    System.out.println(input);
  }
}

etc-image-23

 

조건에 따른 학점 출력하기

package p03_method;

import javax.swing.*;
import java.util.Scanner;

public class Ex07condition {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    while (true) {
      //입력하는 방법 01
      //입력하는 부분
      System.out.print("성적 입력(0 입력시 종료_): ");
      int input = sc.nextInt();
      String reault = "";
      //입력하는 방법 02
      //String score = JOptionPane.showInputDialog("점수를 입력하세요 : ");
      //int input = Integer.parseInt(score);
      //학점 내는 부분
      if (input == 0) {
        System.out.printf("성적 입력을 종료 합니다.");
        break;
      } else if (input >= 90) {
        reault = "A";
      } else if (input >= 80) {
        reault = "B";
      } else if (input >= 70) {
        reault = "C";
      } else if (input >= 60) {
        reault = "D";
      } else {
        reault = "F";
      }
      //학점 디테일 내는 부분
      if(input != 0 && reault != "F"){
        if(input % 10 >= 7 && input %10 <=9) {
        reault += "+";
        }
        else if(input % 10 >= 4 && input %10 <=6) {
          reault += "0";
        }
        else if(input % 10 >= 0 && input %10 <=3) {
          reault += "-";
        }
      }
      //출력하는 부분
      System.out.printf("%s 학점 \n", reault);
    }
  }
}

etc-image-24