본문 바로가기
개발자로 가는 길(국비지원과정)/1. Java

[자바복습 Day05] 프로그래밍의 흐름(thread), 객체지향언어(절차-> 구조-> 객체지향), 자바의 변수(지역변수, 인스턴스변수, 클래스변수의 차이), 생성자의 역할, 자료형의 기본값

by 레아Leah 2022. 1. 3.
반응형

예전의 프로그래밍은 절차적이었지만 프로그램이 커질수록 문제가 커져서 문제발생 

절차적(문제: 스파게티코드) -> 구조적(반복적으로 사용하는 블럭을 따로 빼는 함수, 메소드) -> 

 

 

<메소드를 만드는 문법 규칙> 

: [(접근지정자/ 생략가능)] [키워드] return type 메소드명([파라미터 변수 선언]){

  ....

[return 값, 식, 변수];

}

 

더보기

//메소드를 만드는 문법 규칙 
//define method 
public static void methodA() {
System.out.println("메소드 A입니다.");

: { } 생략 불가

: 반복되는 코드를 작성 후 return

: 메소드명은 변수명 규칙과 동일 

: 프로그램의 시작은 main이며 main블럭 이후에 메소드를 작성! 

: 메소드는 클래스 안에 만들어 놓고 호출 call! 

: 메소드는 메소드 안에 만들 수 없다. 

 

★접근지정자: [default], protected, public, private 

★키워드 : static, final 

thread: 프로그램의 흐름, 과정을 한 줄로 쭉! 

 

▶메소드 오버로딩

: public static int add 메소드 이름이 같고, 매개변수의 개수, 타입이 다르다. 

: 사용하는 이유는 

 

키워드 static 

: 모든 프로그램은 실행하기 위해 메모리에 로딩이 되어야 실행할 수 있다. 

: 메모리에 데이터에 올리는 역할을 한다. (프로그램이 구동되면 바로 메모리에 올라감!)

: 언제든지 호출해서 사용할 수 있게끔 메모리에 올려준다. 

: static 메소드에서는 non-static에 접근 불가하다, non-static는 new를 사용해서 객체를 생성해야 메모리에 올라오기 때문에~! 

: static(static inner class 등등)이라는 말이 붙어있으면 메소드, 상수가 올라가는 영역에 저장된다.  

 

더보기

//메모리에 안올라가 있는 상황! 

public static int add(int a, int b, int c) {
int result = a+b+c; 
return result; 
}

==> 메모리에 올리기 위해서는 클래스를 올림? 

MethodTest2 mt = new MethodTest2();

이런 식으로 호출할 수 있다! 

static이 붙은 메소드 : 클래스에 속해있는 메소드(클래스 메소드)

static이 없는 메소드 : 인스턴스 메소드, 클래스 전체를 올려야 메모리에 올라감.  

==> static 메소드에서는 non-static에 접근 불가 

쓰지도 않은 메모리가 메모리에 올라가 있으면 메모리 낭비이기 때문에 non-static을 더 많이 쓴다. 

 

멤버변수(인스턴스변수)를 바로 메모리에 올리고 싶은 경우에는

static int grade; 이렇게 작성해주면 된다. 

 

MyCircle circle = new MyCircle();//지역변수 

int a = 10;

// 타입 변수명 = 객체; 

//참조자료형의 타입은 무한함, 내가 만들면 그만임. 

 

인스턴스변수는 new할 때마다 생김! new할 때마다 메모리에 올라가는 변수를 인스턴스변수라고 한다. 

 

더보기

// 타입 변수명 = 객체; 

MyCircle circle = new MyCircle();//지역변수
MyCircle temp = new MyCircle();

circle.radius = 5; 
temp.radius = 7; 

 

전혀 다른 것임! 

 

객체지향 프로그래밍을 할 경우, 멤버변수와 멤버메소드가 합쳐진 것이 클래스 

클래스 = 멤버변수+멤버메소드

나의 멤버라고 부름! 우리 멤버 this

더보기

public class MyCircle {
int radius; //멤버변수만 존재! 

static int temp; //class변수, 우리멤버가 아님, 메모리를 따로 올릴 필요가 없기 때문 

public void calcArea() {
this.radius=3;

this.temp = 33; //우리멤버가 아니여도 this를 사용할 수 있지만 굳이 쓰지 않아도 된다고 경고가 뜬다. 
}
}

 

<자바의 변수 3가지> 

: 클래스변수(static), 인스턴스변수, 지역변수 

: 구분짓는 중요한 요소는 '변수의 선언된 위치' 

: 멤버변수를 제외한 나머지 변수는 모두 지역변수이며, 멤버변수 중 static이 붙은 것은 class변수, 붙지 않은 것은 인스턴스 변수 

 

더보기

public class Calculator {
int a =10; //인스턴스변수
int b = 2; 

public int add() {
int result = a + b; //지역변수
return result; 
}
}

 

<클래스명.상수>

System.out.println(MyCircle.TEMP);

double area = radius*radius*Math.PI;

 

 

static변수, 메소드를 불러오기 위해서는

클래스명.메소드명 or 클래스명.변수명(이태리체로 살짝 누워있음!) 

MyCircle.something();

 

 

메소드를 출력할 때는 클래스명.메소드명()

더보기

//캡슐화 

public class Calculator {

//멤버변수, 인스턴스변수
int a =10; 
int b = 2; 

 

//멤버메소드

public void add2() {
System.out.println(this.a + this.b);
}

 

public int add() {
int result = a + b; 
return result; 
}
public int substract() {
int result = a - b; 
return result; 
}
public int multiply() {
int result = a * b; 
return result; 
}
public int devide() {
int result = a / b; 
return result; 
}

}

 

다른 클래스에서 출력해보기  

메소드를 출력할 때는 클래스명.메소드명()

더보기

public class CalculatorTest {
public static void main(String[] args) {


Calculator cal = new Calculator();

 

//초기화, 아래와 같이 접근하는 것은 좋지 않다. 멤버필드에 직접 접근하는 것은 nono!   

cal.a=20; 
cal.b=4; 

 

cal.add2();
System.out.println(cal.add());
System.out.println(cal.substract());
System.out.println(cal.multiply());
System.out.println(cal.devide());
}
}

 

//출력값

24
24
16
80
5

 

클래스 선언 후, 메소드를 호출하는 방법과 메소드를 정의하는 법을 아는 것이 중요하다. 

cal.a=20; 멤버필드에 직접 접근하는 것은 nono! 

보안을 위해 => private int a; 이렇게 사용 

 

 

캡슐화 ==> 멤버변수는 hide 감춰둔다.(정보은닉!, information hiding)

밖에서 값을 못넣음! 

멤버들이 보이지 않기 때문에 값을 넣기 위해 우회적인 경로를 만들어 준다. ==> setter

: setter를 만드는 규칙 public void set변수명(대문자로)

더보기

private int a; 

 

public void setA(int tmp) {
a = tmp; 
}

 

//출력하기 위해서는 

cal.setA(24);
cal.setB(12);

setter 

: 값을 넣기 위한 것, 값을 변경

 

getter

: 외부에서 데이터를 뽑아내고 싶을 때 사용

더보기

//접근지정자 + return타입 

public int getA() {
return a; 
}

 

디자인패턴(GoF)

: 객체지향언어(자바)와 같은 언어에서 디자인 패턴을 강조한다. 

: 3년차 이후부터 공부하는 편 

: 멤버변수는 private으로 setter, getter를 만들어주세요 또한 디자인패턴 중 하나이다. 

 

정보은닉 private 멤버변수는 감추고,  

정보공개 public 멤머메소드는 개방한다. 

 

메소드 이름은 개발자들이 유추할 수 있게 작성한다. 

 

public void setA(int tmp) {
a = tmp; 
}

에서 int tmp는 지역변수이다. 지역 안에서는 가장 우세하다.  

 

public void setA(int a) {
this.a = a; 
}

=> 지역변수 a를 우리멤버변수에 대입! 

 

자동으로 setter, getter 생성하는 방법 

: Source > generate getters/setters 

: 단축키 alt + enter 

: 멤버 변수 + setter, getter + 비즈니스 로직

: 비즈니스로직을 호출해야 출력된다. 

: 비즈니스 로직과 원천데이터는 따로 두는 것이 더 좋다(분리하는 것이 gooD!). 오류가 발생하기 쉽기때문이다. 

 

 

<생성자 메소드 constructor(메소드)> 

Student st = new Student(); 

마치 메소드를 호출해주는 것처럼 생겼다. 

EX) st.sum(); 메소드 

: 클래스마다 정의되어있다. 

: JVM이 자동으로 생성하고 기본값 (0, false)으로 셋팅한다. 개발자가 만들면 JVM 생성자를 안만든다. 

: 역할로는 멤버변수를 메모리에 로딩하고 초기화하는 역할 수행! 

: 생성자는 리턴타입이 없으며, 클래스명과 동일하다. 

더보기

public Student(){

 

}

 

★메모리에 올리는 것

1. Student st = new Student(); //객체 생성

2. 생성자 

=> 값을 넣기 전에는 기본값으로 초기화되어 있다. 

 

 

boolean의 setter, getter

더보기

public boolean isB() {
return b;
}
public void setB(boolean b) {
this.b = b;
}

 

//isBool

boolean은 isBool이기때문에 get이 아닌 isB

 

 

 

<자료형의 기본값> 

더보기

System.out.println(t.getI());
System.out.println(t.getD());
System.out.println((int)t.getC()); //코드값이 보이지 않기 때문에 (int) 캐스팅해서 값을 보여지게끔! 
System.out.println(t.isB());

int형 0
double형 0.0
char형 0
boolean형 false

 

 

Temporary t = new Temporary();

이러한 객체는 반드시 단방향 생성을 해야한다. 

쌍방향 호출은 노노! 

 

반응형