예전의 프로그래밍은 절차적이었지만 프로그램이 커질수록 문제가 커져서 문제발생
절차적(문제: 스파게티코드) -> 구조적(반복적으로 사용하는 블럭을 따로 빼는 함수, 메소드) ->
<메소드를 만드는 문법 규칙>
: [(접근지정자/ 생략가능)] [키워드] 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();
이러한 객체는 반드시 단방향 생성을 해야한다.
쌍방향 호출은 노노!