산술 연산자

복합 대입 연산자 ( +=, -= , *= … )

a+= >> a = a + 1

a-= >> b = b - 1

개인적으로 오른쪽 식이 저는 더 보기 좋습니다

코드는 자기가 알아보기 좋게 작성하는게 이득

증감 연산자 ( 전위 후위 )

비교 연산자 ( == . != )

논리 연산자 ( && || )

삼항 연산자 조건식 ? ‘true 값’ : ‘false 값’ >> 대입연산자로 바로 변수에 값 초기화도 가능

메소드(함수)

함수를 설명하기에 가장 친숙한 그림 마법의 함수 상자 입니다.

사과를 한 개 넣으면 막 세 개가 나오고… ㅋㅋ 😆

x 값을 넣으면 y 값으로 나온다 (일반인의 생각)

매개변수 x 를 넣으면 y값이 리턴 된다 (개발자의 생각) 😎

static stack heap ???

함수를 설명하기 전에 조금 심화 단계 일 수도 있지만

자바 프로그램의 동작 원리를 알아보겠습니다

이걸 설명하기 위해선 ‘메모리’라는 개념이 등장하는데요

컴퓨터 부품 중에 RAM 이라는게 있죠? Random Access Memory 의 약자인데 이것도 메모리입니다

음악 프로그램, 크롬, 게임 등등 무언가 프로그램을 실행하려면 운영체제에게 메모리를 할당 받아서 실행을 하게 되는데 자바 프로그램 또한 똑같습니다.

우리가 Application을 만들어서 ▶️ RUN 버튼을 누르면 프로그램에 메모리가 할당이 되는데 총 3가지 종류의 메모리가 있습니다.

Static ( 정적 데이터 저장 공간 )

이는 전역 변수와 정적 멤버 변수 static이 붙은 자료형을 저장합니다. 문제는 한 번 선언된 전역 변수는 언제 어디서든 꺼내 쓸 수 있습니다. 덕분에 개발시에 편리하지만 메모리가 계속 상주해 있습니다. 그래서 사이트가 느려지고 서버가 다운되는 경우가 발생하기도 합니다. 그래서 스태틱 메모리 영역은 정말 잘 사용해야 합니다.

Stack ( 메소드(함수) 의 생명주기, 기본 자료형 )

기본 자료형을 생성할때 저장되는 공간이 스택 메모리 영역입니다. 데이터 값이 저장되는 공간이라고 보면 됩니다. 메소드가 실행될때 할당 되고 메소드가 종료하면 함께 종료됩니다.

추가) main 메소드도 이 저장공간 가장 첫 스택으로 실행됩니다. main이 스택에서 꺼내질 때, 
프로그램이 종료 됩니다.

*생명주기 = 시작부터 종료 까지의 기간

Heap ( 동적 데이터 저장 공간, new 인스턴스 )

인스턴스 생성할때 생성되는 메모리 형식입니다. new를 사용하여 객체를 생성하면 저장됩니다. 참조형 자료도 힙 메모리 영역으로 저장됩니다. 힙 참조 값은 스택 메모리 영역에서 가지고 있고 해당 객체를 통해서만 힙 메모리에 있는 인스터스들을 핸들링 할 수 있습니다.

 

▲ 더블 클릭하면 확대 되네요 ( 노션에서는 됐는데 티스토리 이 쓰레기 블로그 ㅠㅠ )

메소드의 형식

//   *접근제한자 : 아직 배우지 않았지만. public , private 등등 이 있음.
// static 함수인 경우
접근제한자 static 반환자료형 함수이름 (매개변수, ...){
	작업하고싶은 행위 마음껏 입력

	return (반환자료형에 맞는 데이터);
}

// static 함수 아닌경우
접근제한자 반환자료형 함수이름 (매개변수, ...){
	작업하고싶은 행위 마음껏 입력

	return (반환자료형에 맞는 데이터);
}

// 반환자료형이 void 인 경우   >> return이 없음
접근제한자 void 함수이름 (매개변수, ...){
	작업하고싶은 행위 마음껏 입력

}

//   *매개변수의 개수는 없어도되고, 여러개여도 됨

예시) 
public static void main(String[] args){

}

/*1 */public class Application{
/*2 */	public static void main(String[] args){
/*3 */		Application app = new Application();
/*4 */		System.out.println(app.plusMethod(3,5);
/*5 */	}
/*6 */	
/*7 */	public int plusMethod(int a, int b){
/*8 */		return a + b
/*9 */	}
/*0 */}

메소드의 형식을 알았으니 이제 일반적인 사용 방법입니다.

형식에 맞게 자기가 선언하고싶은 클래스에서 메소드를 정의하면 되는데요 !!!

( 위 예시에서 7행 부분 )

정의는 했지만 이 함수에 접근하기 위해서는 (메모리 개념)

객체 인스턴스를 생성(new) 해야 접근할 수 있습니다.

( 위 예시에서 3행 부분 )

Application 객체의 app 인스턴스에 . (점 ) 연산자를 이용하여 접근해서

plusMethod 메소드를 사용할 수 있습니다.

( 위 예시에서 4행 app.plusMethod(3,5) 부분 )

위에 설명 했던 메모리의 개념으로 코드 예제를 한 행 씩 컴파일러에 빙의해서 해석해볼까요 ~~

2행 : main을 찾았으니 Stack 메모리에 넣어둡니다.

3행 : new 를 찾았으니 Heap 메모리에 Application 클래스의 인스턴스 app 을 넣어둡니다.

4행 : 인스턴스 app이 가지고 있는 plusMethod 함수를 출력 하는 문장이구나

 app 인스턴스니까 Application클래스에 가보면 정의된 plusMethod 이름의 함수를 찾을수 있겠네

7행에 있구나 7행으로 가자

7행 : 함수 실행과 종료 → 4행으로 복귀

5행 : main 함수의 닫히는 중괄호 } 를 만나서 main 함수 종료. 스택 메모리에서 main 사라짐.

⚠️non static 과 static

//메소드의 형식 에서 가져옴

// static 함수인 경우
접근제한자 static 반환자료형 함수이름 (매개변수, ...){
	작업하고싶은 행위 마음껏 입력

	return (반환자료형에 맞는 데이터);
}

// static 함수 아닌경우
접근제한자 반환자료형 함수이름 (매개변수, ...){
	작업하고싶은 행위 마음껏 입력

	return (반환자료형에 맞는 데이터);
}

같은 패키지 안에 있는 다른 클래스 입니다. ( Application9 , Calculator )

Calculator

non static 함수 minNumberOf , static 함수 maxNumberOf

Application9

min 변수에 값을 담을 때, Calculator 클래스의 calc 인스턴스를 생성해서 Calculator의 함수에 접근함

max 변수에 값을 담을 때, 인스턴스를 만들지 않고 클래스에서 바로 함수에 접근함

굳이 인스턴스를 만들어서 static 함수에 접근하면 컴파일러가 노란줄을 긋고 경고한다.

정처기 실기에도 가끔 출제가 되는 static 개념

⚠️다른 클래스( Calc ), 다른 패키지의 함수에 접근하기( import )

아직 정리 못했음 !

package com.uni.section02.method;

public class Application1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		/* 패키지와 임포트 */
	      /* 패키지 : 서로 관련 있는 클래스 또는 인터페이스 등을 모아 하나의 묶음(그룹)으로 단위를 구성하는 것을 말한다.
	       *        같은 패키지 내에서는 동일한 이름의 클래스를 만들 수 없지만, 패키지가 다르면 동일한 이름을 가진 클래스를 만들 수 도 있다.
	       *        클래스명은 원래 패키지명을 포함하고 있기 때문이다.  예)com.uni.section01.method.Calculator (이게 클래스명이다.)
	       *        지금까지 클래스명에 패키지명을 함께 사용하지 않은 이유는 동일한 패키지 내에서 사용했기 때문이다.
	       *        그렇기 때문에 서로 다른 패키지에 존재하는 클래스를 사용하는 경우에는 클래스명 앞에 패키지명을 명시해서 풀 클래스 이름으로 사용해야 한다.
	       * */
		
		// non static 메소드
		com.uni.section01.method.Calculator calc = new com.uni.section01.method.Calculator();
		
		int min = calc.minNumberOf(30, 20);
		System.out.println(min);
		
		// static 메소드
		int max = com.uni.section01.method.Calculator.maxNumberOf(30, 20);
		
		System.out.println(max);
	}

}

패키지 경로명을 import 하지 않으면 손으로 일일이 타자로 입력 해야 한다.

package com.uni.section02.method;
import com.uni.section01.method.Calculator;      // 추가된  코드

public class Application2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
	      /* 패키지와 임포트 */
	      /* 임포트 : 서로 다른 패키지에 존재하는 클래스를 사용하는 경우 패키지명을 포함한 풀 클래스 이름을 사용해야 한다.
	       *        하지만 매번 다른 클래스의 패키지명까지 기술하기에는 번거롭다.
	       *        그래서 패키지명을 생략하고 사용할 수 있도록 한 구문이 import 구문이다.
	       *        import는 package 선언문과 class 선언문 사이에 작성하며
	       *        어떠한 패키지 내에 있는 클래스를 사용할 것인지에 대해 미리 선언하는 효과를 가진다.
	       * */
		
		Calculator calc = new Calculator();
		
		int min = calc.minNumberOf(30, 20);
		System.out.println("두 수중 최소값은 " + min);
		
		int max = Calculator.maxNumberOf(30, 20);
		System.out.println("두 수중 최대값은 " + max);
	}

}

상단부에 패키지 경로를 import 하게 된다면 편하게 사용할 수 있다 !

복합 대입 연산자 ( +=, -= , *= … )

a+= >> a = a + 1

a-= >> b = b - 1

개인적으로 오른쪽 식이 저는 더 보기 좋습니다

코드는 자기가 알아보기 좋게 작성하는게 이득

증감 연산자 ( 전위 후위 )

비교 연산자 ( == . != )

논리 연산자 ( && || )

삼항 연산자 조건식 ? ‘true 값’ : ‘false 값’ >> 대입연산자로 바로 변수에 값 초기화도 가능

+ Recent posts