[Java] 2020.10.30. day_8 객체화, static변수, method(intstance, static), 반환(return)

2020. 10. 30. 09:07Web_Back-end/Java SE

◎ 객체화

클래스명 객체명 = new 클래스명();

접근지정자, instance변수 다른클래스, 서브패키지에서 사용해보기(import) => day_7 의 instance변수 사용하는 법

부모클래스
같은 패키지의 클래스에서 다른 클래스의 instance변수 사용
다른 패키지에 상속관계의 패키지 안의 클래스에서 
다른 패키지에 상속관게의 자식클래스에서 부모클래스의 instance변수 사용(상속!!)


variable _ 변수

  •  variable _ 변수
    • 목적 : 프로그램에서 사용할 값을 메모리에 일시적으로 저장하기 위해
    • java에서는 istance variable, static variable, local variable 3가지 종류를 제공한다
    • 변수를 선언하는 위치에 따라 다른 변수가 만들어진다
    • 각각의 변수는 생명주기와 사용범위, 사용방법이 다르다
변수종류 instance(member)variable
특징 class field 에 선언한다
객체화하여 사용하는 변수
class를 객체화하면 객체마다 변수 생성
자동초기화
(개발자가 초기화값을 넣지 않아도 된다)
객체가 Garbage Collector 에 의해 사라질 때 메모리에서 사라진다
JVM 의 heap 메모리에 생성된다
static 영역에서는 instance 영역에 직접 접근할 수 없다 =사용방법=> 객체화
생성되는 객체마다 변수의 값을 따로 저장하고 사용해야할 때 사용(class 배울때 다시배움)
작성법 access modifier (접근지정자, 접근제한자, 접근수정자 _ 다 사용하는 용어)

access modifier data type variable name = default value;
접근지정자       데이터형    변수명         =  초기화값;
사용방법 class Test{
   int i; //instance 영역에 선언된 instance변수
   public static void main(String[] args){
      //static 영역
      Test t = new Test(); //객체화 : 클래스명 객체명 = new 클래스명();
      System.out.println( t.i ); //변수의 사용 : 객체명.변수명

      Test t1 = new Test();
      System.out.println( t1.i );
    }
}

Java Test
클래스를 실행했다고 instance variable memory에 올라가지 않는다.
-instance변수는 소스상에 눈에 보이지만 메모리에 올라가지 않기 때문에 사용할 수 없다.
-instance variable을 사용할려면 memory에 올려놓고 사용해야하는데 
memory에 올려놓는 코드를 객체화(instance,  object) 라고 한다.
-객체화 
문법 
)  클래스명 객체명=new 클래스명();
-생성된 객체명으로 변수를 사용한다. 
문법)   객체명.변수명    

instance 변수의
초기화 값

- instance변수를 선언하고, 필요한 곳에서 객체를 생성하면(객체화) 
변수가 memory에 생성되면서 설정된 값을 저장한다.

→ 데이터 형에 따른 초기화 값 비교해보기 
class Test{
    int i; // 정수형 데이터형을 사용한 변수는 초기화 값으로 0이 설정된다.  
    char c;// 문자 데이터형을 사용한 변수는 초기화 값으로 \u0000이 설정된다.
    double d;// 실수형 데이터형을 사용한 변수는 초기화 값으로 0.0이 설정된다.
    boolean b;//불린형 데이터형을 사용한 변수는 초기화 값으로 false가 설정된다. 
    int[] arr; //참조형 데이터형을 사용한 변수는 초기화 값으로 null 이 설정된다.
    String s; //                                       
    Integer ii;//                                      
    MyClass mc; //                                 
}

 

◎ static variable

변수종류 static(class) variable
특징 공용변수 - 하나의 자원을 여러 대상들이 공유하고 사용하는 것
실행중인 JVM에서 하나만 만들어지고 사용된다
자동초기화가 된다
클래스가 실행되면 memory 에 올라간다 
instance 변수보다 참조하는 속도가 빠르다
값이 변경되면 변경된 값으로 모두 사용하게 된다_공용변수이기 때문에
사용하지 않으면 메모리를 계속 점유하고 있기 때문에 메모리의 낭비로 이어질 수 있다
선언위치 class field에 선언한다
선언방법 접근지정자 static 데이터형 변수명;
    class Test{
      static int i;
    }
사용법 공용변수는 특정객체에 속해있는 변수가 아니므로
객체명.변수명의 형식으로 사용하지 않는다 (사용되긴 함)
==> 클래스명.변수명 으로 사용한다.
==> Test.i;

 

▼static 변수와 instance 변수의 선언과 사용법 차이▼

public class UseStaticVariable {

	static int i;//static 변수 - 하나만 생성(공유하여 하나만 사용)
	int j;//instance 변수 - 객체마다 생성(각각 사용)
	
	public static void main(String[] args) {

		//static변수는 클래스가 실행될 때 메모리에 올라가기 때문에 객체명을 사용하지 않고
		//클래스명으로 접근하여 사용한다.
		System.out.println(i);
		//객체화하여 사용하지 않고 클래스명으로 접근가능
		System.out.println(UseStaticVariable.i);
		
		//instance변수는 객체화하여 사용, 객체마다 각각 사용가능
		UseStaticVariable usv = new UseStaticVariable();
		UseStaticVariable usv1 = new UseStaticVariable();
		//instance변수는 객체마다 생성되는 변수이므로 객체명을 사용하여 변수를 접근
		usv.j = 1;
		usv1.j = 2;
		//instance변수는 클래스명으로 접근 불가능하다
//		UseStaticVariable.j = 4;
		
		//static변수는 하나만 생성되는 변수이므로 객체명을 사용하여 변수를 접근하더라도
		//각각 사용되는 것이 아니다(최후에_맨마지막에 변경된 값으로 사용됨)
		//아래처럼 객체명을 사용하여 변수를 사용하는 문법을 권장하지 않는다
//		usv.i = 1000;
//		usv1.i = 2000;
//		System.out.println("usv.j : " + usv.j + ", usv1.j : " + usv1.j);
//		System.out.println("usv.i : " + usv.i + ", usv1.i : " + usv1.i);
//		
		//static변수의 올바른 사용법
		UseStaticVariable.i = 10000;
		System.out.println(UseStaticVariable.i);
		
		
	}//main

}//class

◎ method

  method
특징 업무를 구분하여 작성할 때
중복코드를 최소화할 수 있다
instance method, static method 2가지로 만들 수 있다
polymorphism 을 지원 (method Overload, method Override)
instance
method
클래스의 인스턴스변수를 사용하여 일을 처리하는 method
객체화를 하여 객체명.method명() 으로 호출하여 사용
static
method
객체가 가지고 있는 값을 사용하여 일을 처리하는 것이 아닌,
매개변수로 입력된 값을 가지고 일시적인 연산을 할 때 사용
객체화를 하지 않고 클래스명.method명() 으로 호출하여 사용
문법 접근지정자 반환형 method명 (매개변수..){
  업무구현
}
method의
접근지정자
폴더개념
public : 클래스외부에서 호출 가능
protected : 같은 패키지의 다른 클래스에서 호출 가능
               패키지가 다르면 상속관계의 자식클래스에서만 호출 가능
private : 클래스 안에서만 호출 가능
default : 같은 패키지의 다른 클래스에서 호출 가능
           패키지가 다르면 호출 불가능

※ 메모리개념
static : static method로 만들 때
final : Override를 막을 때
synchronized : multi thread에서 동시 호출을 막을 때
반환형
return type
method안에서 업무처리한 결과를 밖으로 내보낼 때 사용
method를 호출한 곳에서 결과 값을 받을 수 있다

void - 반환값 없음
기본형 데이터형과 참조형 데이터형을 설정할 수 있다
매개변수(parameter)

지역변수에 해당됨

method 외부에 존재하는 값(arguments)을 method 내부로 전달하기 위한 변수
method를 호출할 때 매개변수의 개수와 형에 대해 일치하여 호출

예1)
public char method(int i){
   매개변수 i를 사용하면 외부에 입력 값을 사용할 수 있다 
   return (char)i;
}

호출)
① 반환형이 없을 때(void)
method(값..); 

② 반환형이 있을 때_호출하여 return값을 받는다
데이터형 변수명 = method명(값..); 

예1 method 호출)
char c = method(65);
System.out.println("c의 값은: " + c);
출력)
c의 값은: A

method는 호출하여 일을 수행하고 반환형(return type)으로 일 처리한 결과를 받는다

  method의 호출 방법
class Test{

  public methodA(){
  }

  public static methodB(){
  }
}
instance
method
1. 객체화
Test t = new Test();
2. 호출 : 객체명.method명()
t.methodA();
static 
method
1. 호출 : 클래스명.method명() ==> 같은 클래스 안에 있으면 클래스명 생략가능
Test.methodB();

▼ instance method 사용예

/**
 *instance변수를 사용하여 업무를 처리할 때 주로 만드는<br>
 *instance method 의 사용예
 * @author owner
 */
public class UseInstanceMethod {

	/**
	 * 태어난 년도를 입력받아 나이를 연산하는 업무<br>
	 * 연산식 : 올해-태어난해+1<br>
	 * 올해는 2020년으로 instance variable에 저장되어있다<br>
	 * @param birth 태어난해
	 * @return 연산된나이
	 */
	int year = 2020;
	
	public int getAge(int birth) {
		return year-birth+1;
	}
	
	public static void main(String[] args) {
		
		//getAge(1996); //static영역은 instance영역보다 먼저 호출되기 때문에
		//instance영역의 변수나 method를 직접 호출할 수 없다
		
		//1. 객체화 : static영역에서 instance영역의 자원(변수, method)을 사용하기 위해
		UseInstanceMethod um = new UseInstanceMethod();
		//2. method 호출(객체의 값을 사용하여 업무를 처리한다)
		int birthYear = 1996; //지역변수
		//매개변수를 직접 입력해도 되고, 지역변수 값을 넣어도 됨
//		int myAge = um.getAge(1996);
		int myAge = um.getAge(birthYear);
		System.out.println(birthYear+ "년생은 " + myAge + "살 입니다");
		
		
	}//main

}//class

▼ static method 사용예

/**
 * 입력된 값으로만 업무를 처리하는 static method 사용<br>
 * 
 * @author owner
 */
public class UseStaticMethod {

	/**
	 * 입력되는 수의 절대값을 구하는 일
	 * @param param 입력되는 수
	 * @return 입력되는 수의 절대값
	 */
	public static int abs(int param) {
		return param < 0 ? -param:param;
	}//abs
	
	public static void main(String[] args) {

		//static method는 객체화없이 호출한다
		int num = 30;
		int num2 = -50;
		//같은 클래스에 있으면 클래스 명도 생략 가능
		int resultValue = UseStaticMethod.abs(num);
		int resultValue2 = abs(num2);
		System.out.println(num + "의 절대값은: " + resultValue);
		System.out.println(num2 + "의 절대값은: " + resultValue2);
	}//main

}//class

◎ method의 4가지 형태

○ 반환형 없는 method

  고정적인 일 동적인 일 (가변 일)
특징 1. 반환형 없고(void), 매개변수 없는 2. 반환형 없고(void), 매개변수 있는
작성법 public void typeA(){

}//괄호의 의미는 '호출한 곳으로 돌아가라'라는 의미다
public void typeB(매개변수){

}
호출 객체명.method명();
=>객체명.typeA();
객체명.method명(값);
=>객체명.typeB(값);
    호출할 때에는 method의 
매개변수 갯수와 데이터형을 일치시켜야함
예시 public typeA(){

}
public void typeB(int i, char c){

}

호출) 매개변수 갯수와 데이터형을 일치
객체명.typeB(30, 'A');

반환형 있는 method

  고정 값 가변 값
method가 반환형을 가지고 있다면 method의 가장 마지막 줄에 반드시 return 을 정의해야한다

return 은 값을 반환할 때 사용
문법 ) return 값;
값 에는 상수,변수,연산식이 들어갈 수 있다

특징 3. 반환형 있고, 매개변수 없는 4. 반환형 있고, 매개변수 있는
작성법 public int typeC(){
 .
 . 소스코드
 .
 return 값;  //값을 반환해
//호출한 곳으로 돌아가기
public int typeD( 매개변수 ){
 .
 . 소스코드
 .
 return 값; 
}
호출 변수에 할당하거나, 연산에 참여 시킬 수 있다

객체명.method명();
변수에 할당하거나, 연산에 참여 시킬 수 있다

객체명.method명 (값);
public int typeC(){
 .
 . 소스코드
 .
 return 30; 


int i = 객체명.typeC();
System.out.println( i );

==> 30 이 출력된다
public int typeD( char c ){
 .
 . 소스코드
 .
 return (int)c;  
}

int value = 객체명.typeD( 'A' );
System.out.println( value );

==> 65 가 출력된다

▼ 4가지 종류의 method 사용 예

/**
 * method의 4가지 형태
 * @author owner
 */
public class MethodType {

	/**
	 * 1. 반환형 없고 매개변수 없는 형 : 고정 일
	 */
	public void typeA() {
		System.out.println("고정 일");
	}//typeA
	
	/**
	 * 2. 반환형 없고 매개변수 있는 형 : 가변 일
	 * @param i 입력값
	 */
	public void typeB(int i) {
		System.out.println("가변 일 " + i);
	}//typeB
	
	/**
	 * 3. 반환형 있고 매개변수 없는 형 : 고정 값
	 * @return 정수값
	 */
	public int typeC() {
		return 30;
	}
	
	/**
	 * 4. 반환형 있고 매개변수 있는 형 : 가변 값
	 * @param c
	 * @return c를 정수형으로 변환한 값
	 */
	public int typeD(char c) {
		return (int)c;
	}

	public static void main(String[] args) {

		//객체화
		MethodType mp = new MethodType();
		
		mp.typeA();
		
		mp.typeB(10);

		int today = mp.typeC();
		System.out.println(today);
		
		int code = mp.typeD('A');
		System.out.println(code);
		
		
	}//main

}//class
더보기

2020.11.2 배울 내용

  • 가변 인자형 : Variable Arguments
  • Overload(Overloading)
  • OOP-클래스(7가지 형태), JVM  memory
  • p.283~

 

▽ 문제풀면서 복습하기 ▽

package day1102;

/**
 *method를 작성하고 호출하세요.
1. 자신의 나이를 반환하는 일.
2. 구구단 2단을 출력하는 일.
3. 정수를 입력받아  그 수가 숫자, 영문자대문자, 영문자 소문자의 코드값에
   포함 된다면 해당 문자를 그렇지 않으면 '!' 문자를 반환하는 일.
4. 입력받은 단이 2~9단 사이일때는 구구단을 출력하고, 그렇지 않다면
    "구구단의 유효범위가 아닙니다."를 출력하는 일.
5. 자신의 성을 문자로 반환하는 일. 예) 이름이 홍길동이라면 '홍' 을 반환합니다.

 * @author owner
 */
public class Homwork1 {

	/**
	 * 1. 자신의 나이를 반환하는 일.
	 * @param thisyear
	 * @param birthyear
	 * @return age
	 */
	public static int age(int thisyear, int birthyear) {
		return thisyear-birthyear+1;
	}
	
//	//1번 이렇게 사용하면 instance method
//	int y = 2020;
//	int b = 1996;
//	public int age2() {
//		return y=b+1;
//	}
	
	/**
	 * 2. 구구단 2단을 출력하는 일.
	 */
	public static void gugudan_2dan() {
		for(int i=1; i<10; i++) {
			System.out.println(2 + " x " + i + " = " + 2*i);
		}
	}
	
	/**
	 * 3. 정수를 입력받아  그 수가 숫자, 영문자대문자, 영문자 소문자의 코드값에
	 * 포함 된다면 해당 문자를 
	 * 그렇지 않으면 '!' 문자를 반환하는 일.
	 * @param value
	 * @return
	 */
	char result = (char)33;
	public char codeValue(int value) {
		if(value >= 48 && value <=57) {
			return (char)value;	
		}//숫자의 범위
		else if(value >= 65 && value <= 90) {
			return (char)value;	
		}//영문자대문자의 범위
		else if(value >= 97 && value <= 122) {
			return (char)value;	
		}//영문자소문자의 범위
		else {
			return result;
		}//모두 아닌 값이 들어올 때 반환되는 ! 
	}
	
	/**
	 * 4. 입력받은 단이 2~9단 사이일때는 구구단을 출력하고, 
	 * 그렇지 않다면 "구구단의 유효범위가 아닙니다."를 출력하는 일.
	 * @param gugu 구구단의 단 입력
	 */
	public void gugudan(int gugu) {
		if(gugu >= 2 && gugu <= 9) {
			for(int i=1; i<10; i++) {
				System.out.println(gugu + " x " + i + " = " + gugu*i);
			}
		}//if 문
		else {
			System.out.println("구구단의 유효범위가 아닙니다");
		}
	}
		

	/**
	 * 5. 자신의 성을 문자로 반환하는 일. 예) 이름이 홍길동이라면 '홍' 을 반환합니다.
	 * @return 남
	 */
	public static String myName() {
		return "남";
	}
	
	public static void main(String[] args) {

		//1번문제
		int myAge = age(2020, 1996);
		System.out.println("나의 나이는: " + myAge);
		
		//2번문제
		gugudan_2dan();
		
		//객체화
		Homwork1 hw1 = new Homwork1();
		//3번문제
		int userNum = 122;
		System.out.println(userNum + " 코드값의 문자는 " + hw1.codeValue(userNum) + " 이다.");
		
		//4번문제
		hw1.gugudan(10);

		//5번문제
		System.out.println("저의 성씨는 " + myName() + "입니다");	
		
	}//main

}//class