본문 바로가기
PROGRAMING📚/Java📑

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

Ta이니 2024. 6. 20.
728x90
반응형

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

 

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)과 순서가 달라야함

 

기본 생성자

 

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


    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) 사용자가 생성자를 등록하면 기본 생성자는 자동추가 안됨

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

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

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

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;
  }
}

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 초기화 객체는 인스턴스 생성 할때 마다 생김


 

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);

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 의 값이 변하지는 않는다

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을 넣어준다는 의미가 됨

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


메서드의 가변 인자

인자가 1개인 경우
인자가 2개인 경우
인자가 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");
  }
}

인자가 많은 경우, 배열 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);

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);
  }
}

 

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);

 

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);

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


 

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);
  }
}

 

조건에 따른 학점 출력하기

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);
    }
  }
}

728x90
반응형

댓글