본문 바로가기
PROGRAMING📚/Java📑

Java ::구성- Class 변수 선언

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

변수 선언

 

패키지를 선택하고 

오른쪽 마우스 클릭 New -> Java class로 생성이 가능하다

 

변수의 선언 위치

 

변수의 선언 위치는 2가지로 나누어진다

전역 변수(Global variable)와  지역 변수 (Local variable)

public class Ex01 {
  //변수의 선언 위치 :: 전역, 지역
  int sum; //멤버변수는 전역(global variable)
  public void sum(){
    int sum =1; //지역(local variable)
  }
}

중복 선언되어서 에러 발생, 같은 레벨에서는 동일한 이름 사용할 수 없음

 

메소드를 실행하기 위해서는

반드시 메인 메소드가 존재해야한다

 

package p02_variable;

public class Ex01 {
  //변수의 선언 위치 :: 전역, 지역
  int sum =2; //멤버변수는 전역(global variable)
 
  public void sum(){
    System.out.println("Global_sum :" + sum); //Global_sum :2
    int sum =1; //지역(local variable)
    System.out.println("Local_sum :" + sum); // Local_sum :1
  }

  public static void main(String[] args) {
    Ex01 ex1 = new Ex01();
    System.out.println("Vsum :" + ex1.sum); //변수 출력
    ex1.sum(); //함수 실행
  }
}

 

지역변수에서는 지역변수가 우선시 된다

변수의 종류

Primitive type ( 일반 변수는 실제 값을 가짐 )

package p02_variable;

public class Ex02Types {
  public static void main(String[] args) {
    //변수의 종류: Primitive - 일반 변수, Reference - 참조 변수
    //Primitive type ( 일반 변수는 실제 값을 가짐 )
    boolean power = true; //논리형 true, false 1byte(8bit)
    char c1 = 'A';  // 문자형, 2byte, 0 ~ 65535 ->Char는 오로지 한글자만 입력가능
    byte b1 = 10; // 정수형 , 1byte, -128~127
    short s1 = 10; //정수형,2byte,-32768~32767
    int i1 =10; //정수형,4byte,-2147483648~2147483647
    long l1 = 10L; //정수형,8byte,-61경~
    float f1 = 0.1f; //실수형,4byte,소수점 7째 자리까지,표현 범위 : 10^-45~10^38
    double d1 = 0.1d; //실수형,8byte,소수점 13째 자리까지, 표현 범위 : 10^-324~10^308
  }
}

 

일반 변수의 기본값은 

 

 

자바의 정수 연산은 최소 단위가 4바이트로

byte나 short의 연산 단위가 기본으로 4바이트이다

그래서 연산할 때 주로 4byte(정수형 : int, 실수형 : float)를 사용한다

 

Reference type(참조형 변수, 주소값을 가짐)

public class Ex02Types {
  public static void main(String[] args) {
    //Reference type(참조형 변수, 주소값을 가짐)
    String str = "Hello";
    System.out.println(str);
    Animal animal = new Animal();
    System.out.println(animal);
  }

}

 

String 은 그대로 출력되도록   "재정의" 되어 있어 문자 그대로 출력된다

 

참조형 변수의 경우 인스턴스의 주소값을 보냄

주소 값을 가지기 때문에 

해쉬테이블의 값을 출력함

 

package p02_variable;

import p01_class.Animal;

import java.util.Locale;

public class Ex02Types {
  boolean power;
  char c1;
  byte b1;
  short s1;
  int i1;
  long l1;
  float f1;
  double d1;
  String str ;
  Animal animal;
  
  public static void main(String[] args) {
    Ex02Types ex2 = new Ex02Types();
    System.out.println(ex2.power);
    System.out.println(ex2.c1);
    System.out.println(ex2.b1);
    System.out.println(ex2.s1);
    System.out.println(ex2.i1);
    System.out.println(ex2.l1);
    System.out.println(ex2.f1);
    System.out.println(ex2.d1);
    System.out.println(ex2.str);
    System.out.println(ex2.animal);
  }

}

 

자료형은 기본값으로

 

다음과 같은 기본 값을 가지고 있다


 

변수를 사용할 때, 할당이 필수로 되어야 함

할당이란 선언과 초기화가 된 것을 말함

 

type 변수명 = 값(실제 , 주소)

ex)  int num; //선언

ex)  num = 10; //초기화

 

선언과 초기화가 됬다는 것 = assignment(할당)

ex) boolean power = true; 

 

지역변수는 무조건 할당(선언+초기화)된 변수만 사용이 가능하다

 

전역에서 선언된 변수는 초기화가 되어있지 않아도 사용이 가능하다

하지만, main 메소드는 static 메소드로 static 변수의 전역변수만 사용이 가능하다

 

전역변수에 있는 total 변수를 사용하기 위해서는

인스턴스를 만들어서 다음과 같이 사용해야지 사용이 가능하다

 

여기서 인스턴스를 만드는것을 초기화를 시켜주는 것과 같다

package p02_variable;

public class Ex03Static {
  /*
  변수의 할당 = 선언 +초기화
  멤버변수는 선언만 new연산자(생성자)를 통해 기본값으로 초기화
  멤버변수가 할당이 된 것은 new 에서 제외
  */
  //static 이 붙은건 프로그래밍의 시작점으로 파일을 실행하기 전에 불러옴
  static int sum;
  int total;
  private void Foo(){
    System.out.println(total + sum);
  }
 
  public static void main(String[] args) {
    //지역변수를 사용하기 위해서는 반드시 할당을 해야함
    //전역변수를 사용하기 위해서는 인스턴스를 만들어야 한다
    int plus =10;
    System.out.println(plus);
    
    //main 메소드는 static 메소드로
    //static 변수의 전역변수만 사용이 가능하다
    System.out.println(sum);
    //System.out.println(total);
    
    Ex03Static ex3 = new Ex03Static();
    System.out.println(ex3.total);
  }
}

static

static 은 main() 가 실행되기 전에 JVM이

method area 에 로드된다

 

JVM 안의 구조

 

1. method ,area, static =메인메소드 들어가기 전에 올려두는 것

2. heap 영역, instance

3. callstack

 

명확한 값이 올라가야함

 

따라서 main 메소드 안에 있는 변수가 초기화 되어있지 않으면

값이 명확하지 않아서 에러가 발생한다


package p02_variable;

public class Ex03Static {
  // {} 초기화 구간
  {
    System.out.println("인스턴스 실행됨");
  }
  static {
    System.out.println("한번만 실행됨");
  }
  public static void main(String[] args) {
    Ex03Static ex1 = new Ex03Static();
    Ex03Static ex2 = new Ex03Static();
  }
}


static과 Instance 의 차이

 

Instance 값은 각각의 값을 가지고

static은 공통의 값을 가진다

package p02_variable;

public class Ex03Static {
  static int vs; int vi;

  public static void main(String[] args) {
    Ex03Static ex1 = new Ex03Static();
    Ex03Static ex2 = new Ex03Static();
    ex1.vi =10;
    System.out.println(ex1.vi);
    ex2.vi =20;
    System.out.println(ex1.vi);
    ex1.vs =100;
    System.out.println(ex1.vs);
    ex2.vs =200;
    System.out.println(ex1.vs);
  }
}

 

ex1.vi=10; 의 값은 인스턴스 변수로

ex2.vi =20; 와 관계없이 같은 값을 출력한다

하지만

 전역변수인 ex1.vs =100; 의 값은
    ex2.vs =200; 에 의해서 ex1의 값도 함께 변한다

 

 


boolean

TV 클래스 구현하기

 

클래스는 재사용하는 것이 궁극적인 목적으로

재사용을 하여 코드의 생산성을 높이기 위함

 

다음 예시는 TV 클래스 안에있는

power() 메소드를 사용해서

 

전원이 켜졌는지 꺼졌는지 출력해주는 클래스의 예시이다

class TV {
  boolean power;
  int chanel;
  int volume;
  // 메소드 => 리턴타입 함수명() {}
  void power(){
  	// 방법 1 
    if(power == false){
      power = true;
      System.out.println("전원이 켜졌습니다.");
    }
    else{
      power = false;
      System.out.println("전원이 꺼졌습니다.");
    }
    // 방법 2 :a+b(이항 연산자), a++(단항 연산자), a?b:c (삼항 연산자)
    power =!power;
    System.out.println(power ? "전원이 ON" : "전원 OFF");
  }
}
public class Ex04boolean {
  public static void main(String[] args) {
    TV tv1 = new TV();  //인스턴스 생성, new(생성 연산자)로 초기화 시켜줌
    System.out.println(tv1); //전체를 출력
    tv1.power();
    tv1.power();
  }
}

 

다음 예시는 TV 클래스 안에

ChannelUP() / ChannelDown() 메소드를 사용해서

채널을 올리고 내리는 메소드를 구현 해주었다

 void ChannelUp(){
    //방법 1
    channel++;
    System.out.println("채널 UP "+channel);
    //방법 2
    System.out.println("채널 UP "+ ++channel);
    //방법 3
    channel+=1;
    System.out.println("채널 UP "+channel);
  }
  
   void ChannelDown(){
    if(power){
      //방법 1
      channel--;
      System.out.println("채널 DOWN "+channel);
      //방법 2
      System.out.println("채널 DOWN "+ --channel);
      //방법 3
      channel-=1;
      System.out.println("채널 DOWN "+channel);
    }

 

채널을 다양한 방법으로

증가하는 방법이 있다

 void VolumeUP(){
    if(power){
      //방법 1
      volume++;
      System.out.println("볼륨 UP "+volume);
      //방법 2
      System.out.println("볼륨 UP "+ ++volume);
      //방법 3
      volume+=1;
      System.out.println("볼륨 UP "+volume);
    }
  }
  void VolumeDown(){
    if(power){
      //방법 1
      volume--;
      System.out.println("볼륨 DOWN "+volume);
      //방법 2
      System.out.println("볼륨 DOWN "+ --volume);
      //방법 3
      volume-=1;
      System.out.println("볼륨 DOWN "+volume);
    }
  }

public class Ex04boolean {
  public static void main(String[] args) {
       TV tv1 = new TV();  //인스턴스 생성, new(생성 연산자)로 초기화 시켜줌
    System.out.println(tv1); //전체를 출력
    tv1.power();
    tv1.ChannelUp();
    tv1.ChannelDown();
    tv1.VolumeUP();
    tv1.VolumeDown();
  }
}

 

매개변수를 사용해서

고정값에서 채널 UP/DOWN

  int channel;
  void setChannel(int channel)
  {
    	this.channel = channel;
  }
  
   //매개변수 사용
   tv1.setChannel(12);

 

this.channel은 전역변수인 int channel을 의미하고

this.channel 안에 들어가는 channel은 setChannel의 값에 들어가는 매개변수의 값을 의미한다

즉, this.channel =12; 를 의미함

 

다음 코드를 실행하면

public class Ex04boolean {
  public static void main(String[] args) {
    TV tv1 = new TV();  //인스턴스 생성, new(생성 연산자)로 초기화 시켜줌

    //매개변수 사용
    tv1.setChannel(12);

    tv1.ChannelUp();
    tv1.ChannelDown();
    tv1.VolumeUP();
    tv1.VolumeDown();

  }
}

 

초기 값이 0에서 12로 변하면서

12에서 값이 더해지는 것을 확인 할 수있다

 


char

 

Utils 클래스를 하나 만들어서 다음과 같이 클래스를 만들어 주었다

다음 메서드를 사용하면 obj의 type 형을 알수 있다

(Object는 부모의 조상을 의미)

package common;

public class Utils {
  //자료형을 알수있음
  public static void typeOf(Object obj) {
    System.out.println(obj.getClass().getSimpleName());
  }
}

 

 

일반 자료형에서

boolean은 형변환이 일어나지 않는다

나머지 자료형 char 형을 숫자도 형변환이 가능하다

 

자바에서는 4바이트 단위로 계산을 하기 때문에

char를 연산할 경우,

다음과 같은 현상이 일어난다

 

package p02_variable;

public class Ex05char {
  public static void main(String[] args) {
   char c1 = 'A';
    System.out.println("c1: "+c1);
    Utils.typeOf(c1);
    System.out.println("(int)c1: "+(int)c1);
    System.out.println("형변환1: "+ c1+(int)c1);
    Utils.typeOf("형변환1 :" +c1+(int)c1);
    System.out.println("형변환2: "+ (c1+c1)); //연산할 경우,int로 형변환
    Utils.typeOf(c1+c1);
    System.out.println("형변환3: "+ (c1+(int)c1));
    System.out.println(c1+(int)c1);
  
    char c2 ='a'; //97
    System.out.println((int)c2);
    char c3 = '0'; //48
    System.out.println((int)c3);
  	
    Utils.typeOf(new Animal()); //type : Animal
    //char c4=''; //에러
  }
}

 

'A' 의 아스키코드 값은 65

변수 앞에 (int)를 붙여주면, 'A' 의 아스키코드값인 65가 출력된다

 

c1+(int)c1을 출력하면 65+65 값인 130이 출력이 된다

(c1+c1) 도 마찬가지로 65+65 인 130이 출력되고

typeOf 가 Character 에서 Integer 로 형이 변환된것을 확인 할 수있음

 

public class Ex05char {
  char chr;
  public static void main(String[] args) {
    Ex05char ex05char = new Ex05char();
    System.out.println(ex05char.chr); //공백
    System.out.println((int)ex05char.chr); //공백
    //공백의 hexa 코드값은 '\u0000', ' '
    Utils.typeOf(ex05char.chr);
    if(ex05char.chr == ' '){
      System.out.println("공백");
    }
  }
}

특수문자

char c4 ='\''; // '
char c5 ='\"'; // "
char c6 ='\\'; // \\
char c7 ='\b'; // 백스페이스back space
char c8 ='\t'; // tab
char c9 ='\n'; // 개행
char c10 ='\r'; //캐리지 리턴
char c11 ='\f'; //폼피드

 

println() 을 실행되고 개행되서 출력됨 = \n 과 같은 기능을함

package p01_class;

public class Ex02printf {
  public static void main(String[] args) {
    System.out.println("저 산자락에 긴 노을지면 \n 걸음걸음도 살며시 달님이  \t 오시네");
  }
}

print() 를 사용하면 줄 개행이 되지않고 다음 문장이 이어서 나옴 

자동 개행이 안됨

package p01_class;

public class Ex02printf {
  public static void main(String[] args) {
    System.out.print("저 산자락에 긴 노을지면");
    System.out.print("걸음걸음도 살며시 달님이 \t 오시네 ");
    System.out.print("밤 달빛에도 참 어여뻐라");
    System.out.println("\n");
  }
}

\n 한줄 띄워서 출력됨

public class Ex02printf {
  public static void main(String[] args) {
    System.out.println(7+7+"7"+7+7);
    System.out.println(7+7+"7"+(7+7));
  }
}

앞에까지는 int형으로 숫자를 더하다가

문자형을 만나자마자 뒤의 숫자를 int 가 아닌 문자형으로 출력함

 

문자가 아닌 숫자로 인식하고 싶으면 (소괄호)를 해주면됨

 

printf()

package p01_class;

public class Ex02printf {
  public static void main(String[] args) {
    System.out.printf("2 * %d = %d \n", 1, 2);
    System.out.printf("원주율의 파이는 %f \n", 3.141592);
    System.out.printf(
        "10진수 : %d" +
        "8진수  : %o" +
        "16진수 : %x" +
        "16진수  : %X \n", 10,10,10,10);
  }
}

 

boolean을 제외한 4byte 이하 자료형은 int로 변환후 연산 

package p02_variable;

import common.Utils;

public class Ex06int {
  public static void main(String[] args) {
    byte b1 = 100;
    //자신이 표현할수 있는 범위를 넘어서면 에러 발생
    //byte b2 = 200;
    byte b3 = 100;
    Utils.typeOf(b1 + b3);
    //byte b4 = b1+b3;
    byte b4 = (byte)(b1 +b3);
    System.out.println(b1 +b3);
    Utils.typeOf(b4);
    System.out.println(b4);
  }
}

 

값이 너무 커서 byte형에서는 한바퀴 돌고 다시 나온 값이라고 함

 

    //boolean을 제외한 4byte 이하 자료형은 int로 변환후 연산
    short s1 = 1000;
    short s2 = 1000;
//  short s3 = s1+s2;
    short s3 = (short)(s1+s2);
    Utils.typeOf(s1+s2);
    System.out.println(s3);

 

package p02_variable;

import common.Utils;

public class Ex06int {
  public static void main(String[] args) {
    // long l1 =(long)200; long이 앞에 생략됨 - 묵시적 형변환
    //표현범위가 작은것이 큰것으로 올때는 묵시적 형변환 으로 생략이 가능하다
    long l1 = 200;  // long = int 타입
    long l2 = 200L; // long = long 타입

    //int i2 = l2;
    int i2 = (int)l2; //int < long , 명시적으로 작성해야함
    long  result = i2 +l1;
    Utils.typeOf(result); //long 자료형과 연산을 할 경우, Long 타입으로 형변환

    int i3 = b1; //int = byte :: 묵시적 형변환(int 표현범위가 큼)
    byte b5 = (byte)i3; //byte = int :: 명시적 형변환 
  }
}

 

double

 

정수형의 대표는 int 이고 실수형의 대표는 double 이다

실수형의 대표는 double 이기 때문에 d 생략이 가능함

package p02_variable;

import common.Utils;

public class Ex07double {
  //정수형(int, long)의 대표는 int
  //float, double의 대표는 double

  public static void main(String[] args) {
    float f1 = 0.0f;
    double d1 =0.0;
    Utils.typeOf(0.0);
    Utils.typeOf(0.0f);
  }
}

 

표현범위가 큰 타입으로 형변환 되기 때문에 

float 에 int와 long 값을 더하면 float 형으로 타입이 출력 된다

package p02_variable;

import common.Utils;

public class Ex07double {
  public static void main(String[] args) {
    int i1 =10;
    long l1 = 1000;
    Utils.typeOf(0.0f+ i1);
    Utils.typeOf(0.0f+ l1);
  }
}

  public static void main(String[] args) {
    float f1 = 0.0f;
    double d1 =0.0; //d생략가능

    Utils.typeOf(f1+ d1); //표현범위 큰 타입으로 형변환
    
   d1 = f1; //double = float  :: 묵시적 형변환
    f1 = (float) d1; // 명시적 형변환 필요!
  }

 

declare return

 return type : void, primitive,reference (10가지)

void(1가지) : return 이 없음, primitive(8가지),reference(1가지) : return 을 반드시 해주어야함

package p03_method;

public class Ex01declare {
  //return type : void, primitive,reference (10가지)
  void add(){ //보통은 return을 쓰지 않음 }
  void add(){
  return ; 
  }
}

 

result는 지역변수인데 초기화를 해주지 않아서 에러가 발생함

따라서 다음과 같이 result에 값을 초기화 해주어야한다

package p03_method;

public class Ex01declare {
  boolean b1;
  boolean add1(){
    boolean result = false;
    return result;
  }
}

클래스 인스턴스를 만들어서 result에 b1의 기본값인 false를 할당해줌

package p03_method;

public class Ex01declare {
  boolean b1;

  boolean add1(){
    Ex01declare ex01declare= new Ex01declare();
    result = ex01declare.b1; //기본값 :flase 
    return result;
  }
}

 

다음과 같이 쓰는 경우는 변수를 재사용하지 않을 경우에 다음과 같이 작성해  줄 수 있다

public class Ex01declare {
  boolean b1;

  boolean add1(){
    return new Ex01declare().b1;
  }
}

 

메서드 이름이 중복되면 사용을 할 수 없음

매게변수가 다른 경우에는 사용이 가능하다(*오버로딩)

public class Ex01declare {
  boolean b1;
  void print1(){
  return ; //보통은 return을 쓰지 않음
  }
  char print2(){
    return 'C';
  }
}

 

0.0은 double 이라서 int형보다 크기 때문에 명시적 형변환을 해주어야한다

package p03_method;

public class Ex01declare {
  boolean b1;

  void print1(){
  return ; 
  }
  char print2(){
    return 'C';
  }
 
  public static void main(String[] args) {
    Ex01declare ex01declare = new Ex01declare();
    ex01declare.print1();
    System.out.println(ex01declare.print2());
  }
}

return 값을 출력해주려면

다음과 같이  System.out.println을 사용해서 값을 출력해주어야함

System.out.println를 사용하지않으면 값만 돌려줄 뿐 출력은 되지 않는다

return 타입이 없는 경우(void), 다음과 같이 System.out.println으로 출력할 수없다

 

이름이 같아도 매게변수가 다른 경우,

같은 이름으로 사용이 가능하다

다음과 같은 경우를 오버로딩 이라고 함

 public static void main(String[] args) {
    System.out.println(e1.print());
    System.out.println(e1.print(true));
  }

 

System.out.println(e1.print(true));

boolean print(boolean result){
  return result;
}

 

중괄호 안에서만 result 의 값이 유효하기 때문에

지역변수로 사용된다는 것을 알 수 있다

char print(char c){return c;}

public static void main(String[] args) {
    System.out.println(e1.print('Z'));
}

 

타입형이 달라도 오버로딩으로 사용이 가능하다

대표적인 java 라이브러리로  System.out.println() 이 있음

 

메서드가 가지는 기능(성격)

1) 객체의 속성(상태)을 처리하는 기능
2) 객체의 속성(상태)를 온전(보호)하게 하는 기능

 

Math 클래스 만들기

class Math{
  int sum (int a, int b){
    return a+b;
  }
  int sub(int a, int b){
    return  a-b;
  }
  int mul(int a, int b){
    return a*b;
  }
  double div(int a, int b){
    return a/b;
  }
  double mod(int a, int b){
    return a%b;
  }
}

  public static void main(String[] args) {
    Math m = new Math();
    System.out.println("SUM :"+m.sum(1,5));
    System.out.println("SUB :"+m.sub(1,5));
    System.out.println("MUL :"+m.mul(1,5));
    System.out.println("DIV :"+m.div(10,7));
    System.out.println("MOD :"+m.mod(10,7));
    Utils.typeOf(10/3);
    System.out.println(10/7);
  }
}

 

  double div(int a, int b){
	double result = (double)(a/b);
    return result;
  }

  double div(int a, int b){
   	double result = a/(double)b;
    return result;
  }

  public static int share(int a, int b){
    int result = a/b;
    return result;
  }
  public static int remain(int a, int b){
    int result = a%b;
    return result;
  }
  public static void shareRemain(int a,int b){
    System.out.println("ShareRemain(Share) : "+share(a,b));
    System.out.println("ShareRemain(Remain) :" + remain(a, b));
    
    System.out.printf("몫 : %d , 나머지 : %d \n" , share(a,b), remain(a,b));
    System.out.println(String.format("(string.format) 몫 : %d , 나머지 : %d ", share(a, b), remain(a, b)));
  }
  
   public static void main(String[] args) {
    System.out.println("Share :"+MyMath.share(10,3));
    System.out.println("Remain :"+MyMath.remain(10,3));
    MyMath.shareRemain(10,3);
  }

 

final 상수 :: 값이 할당되면 이후는 변경되지 않음

package p02_variable;

import javax.swing.*;

public class Ex08final {

  public static void main(String[] args) {
    final int GAUS_VAL;
  GAUS_VAL =10;
    System.out.println(GAUS_VAL);
//    GAUS_VAL =20;
    final String INPUT;
    INPUT = JOptionPane.showInputDialog("아이디를 입력하세요");
    System.out.println(INPUT);
  }
}

 

728x90
반응형

댓글