본문 바로가기
CLASS/JAVA

#4-3 / Method

by hingu 2024. 5. 3.

* 4-3 계속 봐야할거 어려움 ㅠ : 

static,final,public,private

메소드 : void,자료형 메소드(String,int..등-return 꼭 필요 )

⚡ 지역변수,전역변수
* final int b =100; // 변수 선언시 final로 선언 : 더이상 값 변경을 못함
* static int c=1; //해당 변수를 메모리에 저장시켜놓음 초기화 x
package oop;

import java.util.Scanner;

public class method1 {

	public static void main(String[] args) {
		//새로운 클래스를 지속적으로 호출함 : 스레드
		//static 사용시 메모리를 3번 저장함(그때그때 계속 저장)
		method1_box mbox1 = new method1_box(); //mbox1 : 객체명
		mbox1.abc();
		method1_box mbox2 = new method1_box(); //class 새로 load / mbox1,mbox2,mbox3 따로놈
		mbox2.abc();
		method1_box mbox3 = new method1_box(); 
		mbox3.abc();
	}

}

//여기서 변수 선언해봣자 의미 x , class와 method안에서만 먹힘 

class method1_box {
	//field 영역 - 라이브러리,배열,변수(상수,메모리) 선언가능
	String user; //전역변수
	int a =10;
	final int b =100;
	static int c=1; //해당 변수를 메모리에 저장시켜놓음 초기화 x
	int d=1;
	
	//field에서 scanner를 선언(전역변수),작동 안하는 상태
	 //가볍게 사용 가능,여러 메소드에서 활용 가능
	Scanner sc = null; 
	
	
	public void abc() { //method
		this.user = "홍길동"; //전역변수
		String user2 = "이순신"; //지역변수
		int a = 30;
		//this.b = 500; //에러 (b 변수 선언시 final로 선언 : 더이상 값 변경을 못함)
		
		this.c++;
		this.d++;
		System.out.println(this.c); 
		System.out.println(this.d); 
		
		this.def();
	}
	public void def() { //method
		//System.out.println(this.user);
		//System.out.println(this.a); // 10출력
		
		//System.out.println(this.user2); //에러 : user2가 지역변수라서
		
		this.sc = new Scanner(System.in);
		System.out.println("아이디 입력 : ");
		String mid = this.sc.next();
		System.out.println(mid);

	}
}
⚡ 외부 클래스 변수값 가져오기 및 변경(public,private)
static은 static만 this로 가져올 수 있음
private : 해당 클래스에서만 사용 및 변경 가능(보안 good)
package oop;
//외부 클래스 변수값 가져오기 및 변경(public,private)
public class method2 {
	//String user = null; 
	static String user = null; //로그인 사용명(메모리에 장소 설정)
	
	//main 메소드는 기본으로 메모리 영역을 무조건 사용한다.
	public static void main(String[] args) {
		//this.user = "홍길동";// 일반 변수로 선언 하면 에러 : static은 static만 this로 가져올 수 있음
		//위에서 static으로 선언하고
		user="홍길동"; //이렇게 써줘야함(메모리에 등록된 전역변수 값을 입력)
		
		method2_box mb2 = new method2_box(); //메모리 영역은 로드를 따로 해줘야함
		mb2.aaa = 500; //외부 클래스 필드에 있는 전역변수 값을 변경
		// mb2.bbb = 25000; 
		  //에러 : 하단에서 private을 선언한 전역변수
           //(private은 외부에선 접근 불가,해당 클래스 안에서만 사용 할 수 있음)
		
		mb2.abc();
		//mb2.zzz(); //에러 : zzz 메소드는 private이라서 abc를 거치진 않고서 호출할 수 없다
		
	}

}

class method2_box{
	
	public int aaa = 100; //일반 전역변수
	private int bbb = 1000;
	
	private void zzz() { //얘는 main에서 강제로 호출못함 
		System.out.println("내부 보안 메소드..");
	}
	
	public void abc() {
		//public class에 있는 메모리 영역의 변수값을 일반 변수에 등록
		String aaa = new method2().user;
		//method2 md = new method2();
		//String aaa = md.user; 이렇게 써도 됨
		
		this.bbb = 50000;
		System.out.println(aaa);
		System.out.println(this.aaa); //500출력(main 메소드에서 500으로 변경,원래는 100출력)
		System.out.println(this.bbb); //50000출력 (내부에서는 값 변경 가능 - private)
		
	}
	
}

 

⚡ 메소드 정의(void, 자료형 + return)
return은 하나의 변수만 사용
package oop;
//메소드 정의(void, 자료형 + return)
public class method3 {

	public static void main(String[] args) {
		method3_box mth3 = new method3_box();
		//mth3.abc();
		
		//자료형 메소드에 인자값을 보낸 후 결과값을 변수로 돌려받음(자료 형테 같아야함)
		String result = mth3.bbb("hong"); 
		System.out.println(result);//return으로 온 결과값을 출력 - hong@nate.com 출력
		
		int sum = mth3.ccc(100,5); //두개의 인자값 전달
		System.out.println(sum); //호출한 class method로 다시 결과값 반환-500출력
	}

}

class method3_box {
	// void 메소드 : 메소드 호출시 산술,연산,결과,실행 등을 출력하는 담당  
	public void abc() {
		System.out.println("abc void 메소드");
	}
	
	// 문자 자료형 메소드-기본(무조건 return이 있어야함)
	public String bbb(String id) {
		String email = "hong@nate.com"; //신규 변수 생성 및 데이터값
		return email; //return을 이용하여 다시 값을 반환함
	}
	
	//정수 자료형 메소드-기본
	public int ccc(int a,int b) {
		int c = a*b;
		return c; //무조건 return값 있어야함;
	}
	
	//메모리 영역에 등록되는 메소드 (return 작성 x - void가 있기 때문)
	public static void ddd() {
		
	}
	
	//메모리 영역에 등록되는 문자 자료형 메소드
	public static String eee() {
		return null;
	}
}
⚡ class 안에 class(부모 클래스 + 자식클래스)
- 실무자 많이사용
package oop;
//class 안에 class(부모 클래스 + 자식클래스) - 실무자 많이사용
public class method5 {

	public static void main(String[] args) {
		parents pr = new parents(); //부모 클래스 먼저 로드
		pr.zzz(); //부모 클래스 안의 메소드 호출
		parents.child pc = pr.new child(); //자식 클래스 로드
		pc.abc();//자식 클래스 안의 메소드 호출
	}

}

class parents { //부모 클래스
	public String a = "홍길동"; //부모 필드의 전역변수
	
	public void zzz() {
		System.out.println("부모 클래스에 있는 zzz 메소드");
	}
	
	class child2 {

	}
	
	class child { //자식 클래스
		public int gugu = 50; //자식 필드의 전역변수
		public void abc() { //자식클래스 안의 method
			
			//parents.this.a : 부모 필드에 있는 전역변수값 로드
			System.out.println("자식 클래스에 있는 abc 메소드 " + parents.this.a);
			System.out.println(this.gugu); //자식 필드에 있는 전역변수값 로드 : 50
		}
		
	}
}

 

⚡ 응용문제 (+선생님 풀이)
사용자가 웹 사이트에 접속 ->
메인화면 : html,css,javascript,React,ajax.Java,Databse,XML ... 
(메모리 쓰는 것 : javascript,React,ajax.Java,Database)
javascript,React : 정적 메모리
Java : 정적 메모리,동적 메모리 둘다 사용
Ajax : 동적 메모리
Database : 정적 메모리
=>메모리는 꼭 필요한 곳에만 쓰는게 좋다!
package oop;

import java.util.Scanner;

/*
응용문제
외부 클래스를 이용하여 사용자가 하나의 숫자값을 입력합니다.
입력된 값이 짝수인지 홀수인지 확인하는 return 메소드 코드를 작성하시오.

[결과]
숫자 하나를 입력하세요: 27
입력하신 결과는 홀수입니다.
*/

public class method6t {
	public static int no; //메모리에 값이 올라가 있음
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("숫자를 입력하세요 : ");
		no = sc.nextInt();
		
		method6_box mb = new method6_box();
		String result = mb.ck(); //return 결과값을 받는 변수
		System.out.printf("%d는 %s",no,result); //최종 출력
		
		sc.close();
	}

}

//this는 외부 클래스에서 활용
class method6_box {
	//전역변수에 메인 클래스에 있는 메모리 변수값을 로드(이게 메모리 쓸 줄 아는 방식..)
	public int user = new method6t().no;
	public String msg = "";
	
	public String ck() {
		if(this.user % 2 == 0) {
			this.msg = "짝수값입니다";
		}else {
			this.msg = "홀수값입니다";
		}
		
		return this.msg;
	}
}

 

'CLASS > JAVA' 카테고리의 다른 글

#5-2 / 2차 원시 배열  (0) 2024.05.07
#5-1 / 1차 원시 배열  (0) 2024.05.07
#4-2 / Scanner + 더블반복문,선택문  (0) 2024.05.03
#4-1 / Scanner + 반복문  (0) 2024.05.03
#3-3 / library(Scanner)  (0) 2024.05.02