구구단 3단 출력
약수 구하기
...
구구단 5단 출력
>> 같은 코드를 반복해서 사용하면 코드 사이즈가 너무 커지고 유지보수가 어려워짐 >> 번거로움
>>> 코드를 모듈화해서 사용 >> 함수
1. 함수
: 기능. 자주 사용되는 코드를 따로 분리해서 필요할 때마다 호출해서 사용하는 방법.
but, 자바는 함수가 없고 메서드만 존재.
(메서드: 클래스 안에 있는 함수)
: 원하는 값을 받아서(입력)(파라메터: 함수가 밖에서 필요한 값을 받아오는 변수)
--> 여러 수식으로 처리해서 (기능)
--> 원하는 형태로 print (출력)(return문을 통해서 값 반환) (return res(변수명); )
return; -----> 현재 메서드 종료
return a; ----> 결과값 반환하고 종료
함수 정의는 main{} 밖에서,
함수 호출은 main{} 안에서.
1) 함수 정의
반환타입 함수명(파라메터) {
함수에서 실행할 문장들;
}
>> 반환타입: return 하고자 하는 값의 타입을 따름 (메서드가 반환하는 값의 타입)
- 'a' 반환 -> char / "asdf" 반환 -> String
: 아무런 값도 반환하지 않을 경우 ---- void
>> 함수명: 자바 이름 명명 규칙에 맞게 생성
>> 파라메터(parameter, 매개변수, 지역변수): 외부에서 필요한 값을 받아올 변수 나열
: 파라메터가 필요 없으면 ()
>> 블록: 함수가 실행할 코드
지역변수: 함수 안에서 선언한 변수 (ex. 파라메터)
: 메서드가 종료하면 유효하지 않음(없어짐)
멤버변수
: 작성한 시점에서 바로 실행 안 됨.
- 호출을 해야 실행됨.
: return문이 없어도 더이상 실행할 코드가 없으면 자동으로 종료.
void f1() {
System.out.print("test");
}
// 함수명: fi, 반환값 없음, 외부에서 값 안 받아옴
int add(int a, int b){
return a + b;
}
// 함수명: add, 반환값: int (함수가 끝나면 int값 반환함)
// 외부에서 int값 2개 받아서 a, b에 저장
// a, b 값을 더한 결과를 반환하고 종료
2) 함수 호출
: 함수의 이름을 부른다.
: 함수를 호출하면 순차적으로 진행되던 코드는 잠시 멈추고,
함수를 정의했던 곳으로 점프하여 함수 코드를 다 실행한 뒤
다시 순차적으로 코드 진행
함수명();
System.out.print("호출 전");
f1(); //함수 호출. 점프(분기)
System.out.print("호출 후");
int x = add(4,5); //4, 5: 파라메터에 들어갈 값, argument(인자)
// add 함수에 반환값이 있으므로 반환값을 받을 변수가 필요함.
System.out.print(x);
// == System.out.print(add(4,5));
▼ 함수 써서 구구단 2~9단 출력
// 단수를 파라메터로 받아서 구구단 한 단 출력. 반환값 없음.
static void gugudan(int dan) {
int i; // 지역변수: 함수 밖에서는 안보임.
for (i = 1; i < 10; i++) {
System.out.println(dan + "X" + i + "=" + (dan * i));
}
}
.
.
.
// 2~9단 출력
int i;
for (i = 2; i < 10; i++) {
gugudan(i);
}
▼ hello 메시지 출력
static String helloMsg2(String name) {
return "hello " + name;
}
.
.
.
String msg = helloMsg2("bbb");
System.out.println("msg: " + msg);
============================
(print)
msg: hello bbb
▼ 배열 값의 총합, 최댓값, 최솟값, 평균
// 함수명 sum, 리턴타입 int, 파라메터 int[] 한 개
// 기능: 배열 요소 합 반환
static int sum(int[] arr) {
int sum2 = 0;
for (int i = 0; i < arr.length; i++) {
sum2 += arr[i];
}
return sum2; //return은 한 번만 돌기 때문에 for문 안에서 사용X
}
//int[]을 파라메터로 받아서, 요소의 max, min, avg 반환
//파이썬 제외한 다른 언어의 함수는 반환값을 1개밖에 반환 못함.
static int[] f2(int[] arr) {
int i, max = arr[0], min = arr[0];
int[] res = new int[3]; //max, min, avg 담을 배열 생성
for (i = 1; i < arr.length; i++) {
if (max < arr[i]) {
max = arr[i];
}
if (min > arr[i]) {
min = arr[i];
}
}
res[0] = max;
res[1] = min;
res[2] = sum(arr) / arr.length; //이전에 생성해 둔 sum 함수 소환 --> avg 계산
return res;
}
.
.
.
int[] a = { 1, 2, 3, 4, 6 };
int s = sum(a); //함수 호출
System.out.println("sum: " + s);
int[] res = f2(a);
System.out.println("max: " + res[0]);
System.out.println("min: " + res[1]);
System.out.println("avg: " + res[2]);
==================================
(print)
sum: 16
max: 6
min: 1
avg: 3
2. 객체 지향 프로그래밍 (Object Oriented Programing)
객체 = 클래스 타입의 "변수" -- 생성해야 함.
Member m1 = new Member(); // 객체 생성
클래스 : Member
객체 : m1
: 객체 중심으로 프로그래밍하는 것 -- 필요한 객체 도출 -> 객체 관계를 명시하는 형태로 프로그래밍
<-> 순차적 프로그래밍(시간 흐름 순서대로) (자바 이전 언어)
: 소형 프로그램 -> 순차적 프로그래밍
: 중대형 프로그램 -> 객체 지향 프로그래밍 ---> 설계 하고 짜야 함.
면접 단골 질문!
Q. 객체 지향 프로그래밍이란?
A. 객체를 정의하고 객체와 객체의 사이의 관계(포함, 상속)를 명시하는 프로그래밍.
Q. 포함 관계란?
A. 다른 클래스 타입의 멤버 변수를 포함하는 것. (has a 관계)(소유)
class Test {
Top t;
}
Q. 상속 관계란?
A. 성질을 그대로 물려받는 것. (is a 관계)(본질)
public class Test extends Top {}
1) 객체
: 프로그램으로 모델링되는 주체 (사물, 사람, 개념)
2) 객체 도출
: 어떤 클래스가 필요하고 그 클래스의 구성 요소가 무엇이냐를 결정
(1) 사용자(실 수요자)의 요구 분석
--- 유즈케이스 (use case): 액터(actor) 추출 (액터 -- 시스템을 사용할 사람이나 시스템)
-> 각 액터에게 제공할 기능 정의
ATM > 출금, 입금, 조회, 송금, 현금서비스
(2) 필요한 기능 도출
---2. 요구 명세서 작성: 기능 당 요구 명세서 하나 작성 (기능 세분화)
==> 객체 도출
- class에 객체 정보를 다 담을 필요 X, 프로그램에 필요한 정보만 담기.
*액터: ATM
*제공할 기능: 출금, 입금, 조회, 송금, 현금서비스
*출금(기능)의 요구 명세서
> 카드를 넣는다 (yes) -> 출금 금액 입력 -> 비밀번호 입력 (yes) -> 계좌에 연결, 잔금 확인 (yes) -> 계좌에서 출금 -> 현금 지급
(no) -> (no) -> (no) ->
에러메시지 보여주고 초기화면으로 이동
=> 이 작업을 통해 **객체 도출
> 카드 (멤버 변수: 카드사, 카드 번호, 카드 비밀번호, 연결 계좌)
> 계좌 멤버 변수: 은행명, 계좌 번호, 계좌 비밀번호, 잔고)
==> 도출된 객체를 기반으로 **클래스 설계
> Card (String name, String num, String pwd, Account xxx)
> Account (String name, String num, String pwd, int money)
class Card {
String name;
String num;
String pwd;
Account account;
}
class Account {
String name;
String num;
String pwd;
int money;
}
3. Class
- 사용자가 타입을 정의
- 한 객체의 (관련있는) 데이터를 한 변수에 담고 싶다 (VO) ---> 캡슐화
- 관리가 쉽다!
* 객체 : 클래스 타입의 변수를 생성한 것
3-1) 타입 정의 -> 변수 선언 -> 객체 생성
* 타입 정의
class Test {
int a; //4B
String b; //4B
float c; //4B
}
- class 는 public class 밖에서 정의한다.
- 타입 이름은 Test (임의로 지은 타입명)
Test 타입의 변수는 int값 1개, String값 1개, float값 1개를 묶어서 저장
--> 즉 타입 Test를 정의한 것
class 안에 있는 변수 -- 멤버 변수 -- heap에 저장
메소드 안에 있는 변수 -- 지역 변수 -- stack에 저장 (4B)
* 변수 선언
Test t1;
* 객체 생성
t1 = new Test(); ---> new 다음에 나오는 Test() 는 생성자(: 클래스와 똑같은 메소드)
Test t1 = new Test(); // 혹은 변수선언과 객체 생성을 동시에 할 수 있음.
// . 은 멤버변수 접근 연산자
// 메모리 할당
t1.a = 10;
t1.b = "asdf";
t1.c = 3.14f; // 3.14는 double 타입이라 float의 f를 넣어 타입을 맞춰줌
System.out.println(t1.a);
예시1.
//클래스는 퍼블릭클래스 밖에서 정의한다.
// 타입명:Person. 변수 하나에 나이, 이름을 담을 수 있
class Person {
int age;
String name;
}
public class Class1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Person p1 = new Person();
p1.age = 10;
p1.name = "aaa";
System.out.println("p1.age:" + p1.age);
System.out.println("p1.name:" + p1.name);
Person p2 = new Person();
p2.age = 20;
p2.name = "bbb";
System.out.println("p2.age:" + p2.age);
System.out.println("p2.name:" + p2.name);
Person p3 = p2;
System.out.println("p3.age:" + p3.age);
System.out.println("p3.name:" + p3.name);
}
}
===============================================
(print)
p1.age:10
p1.name:aaa
p2.age:20
p2.name:bbb
p3.age:20
p3.name:bbb
예시2. 클래스에 메소드 생성해 값 대입~출력 간단하게 코드 작성
class Card1 {
String name;
String num;
String pwd;
//멤버 변수에 값 할당하는 메서드 (메서드: 클래스 안에 들어와있는 함수)
void setData(String na, String nu, String p) {
name = na;
num = nu;
pwd = p;
}
void printData() {
System.out.println("name: " + name);
System.out.println("num: " + num);
System.out.println("pwd: " + pwd);
}
}
//public: 접근 제한자
public class Oop_card {
public static void main(String[] args) {
// TODO Auto-generated method stub
Card1 c1 = new Card1();
c1.setData("aaa", "35673fre3", "1234");
c1.printData();
Card1 c2 = new Card1();
c2.setData("bbb", "35463fre3", "5678");
c2.printData();
}
}
예시3. 클래스로 배열 만들기. (객체 타입 배열)
- 배열을 생성해서 만들어진 방에는 (방만 만들어졌기 때문에) 방 안에는 모두 null로 초기화되어 있음.
===> 따라서 값을 저장하기 전에 객체를 생성해서 값을 방에 넣어줘야 함.
Point[] arr = new Point[3]; // 방만 만들어짐
(x) ----- arr[0].x = 1; //null point exception error!!!!
(o) ----- arr[0] = new Point(); //방부터 만들고 값 대입
arr[0].x = 1;
//좌표
class Point {
int x, y;
void setData(int xx, int yy) {
x = xx;
y = yy;
}
void printData() {
System.out.println("x: " + x);
System.out.println("y: " + y);
}
}
public class 객체배열 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Point[] arr = new Point[3];
arr[0] = new Point();
arr[0].setData(1, 2);
arr[0].printData();
// arr[0].x = 1;
// arr[0].y = 2;
// System.out.println("arr[0].x: " + arr[0].x);
// System.out.println("arr[0].y: " + arr[0].y);
arr[1] = new Point();
arr[1].setData(3, 4);
arr[1].printData();
// arr[1].x = 3;
// arr[1].y = 4;
// System.out.println("arr[1].x: " + arr[1].x);
// System.out.println("arr[1].y: " + arr[1].y);
arr[2] = new Point();
arr[2].setData(5, 6);
arr[2].printData();
// arr[2].x = 5;
// arr[2].y = 6;
// System.out.println("arr[2].x: " + arr[2].x);
// System.out.println("arr[2].y: " + arr[2].y);
}
}
*** 총 정리 ***
class 클래스명 {
멤버변수 정의;
}
클래스명 변수명 = new 생성자(=클래스명)();
변수명.멤버변수명 = 값;
=================((exemple))====================
class Test {
int a;
String b;
//setter: 파라메터로 받은 값을 멤버 변수에 할당
//setter 의 메서드 타입: void
void setData(int x, String y) {
a = x;
b = y;
}
void printData() {
System.out.println ("a: " + a);
System.out.println ("b: " + b);
}
}
----------- public class -----------
--------------- main ---------------
Test t1 = new Test();
t1.setData(10, "aaa");
t1.printData();
Test t2 = new Test();
t2.setData(20, "bbb");
t2.printData();
Test[] arr = new Test[2]; //Test 객체 배열 여러개 저장. 방 만듦. Test 객체는 1개도 없음.
arr[0] = new Test(); //★Test 객체 생성해서 배열에 저장
arr[0].setData (30, "qqq");
arr[1] = new Test();
arr[1].setData (40, "www");
for (int i = 0; i < arr.length; i++) { //배열 출력할 때는 for문
arr[i].printData();
}
3-2) 객체 관계 -- 포함관계 & 객체관계
(1) 포함관계
: 다른 클래스 타입을 멤버변수로 갖는 것
--> 값을 저장하기 전에 생성을 해야! 사용 가능하다~
// 카드 관련 클래스
class Card3 {
String name;
String num;
String pwd;
// 포함관계
Account acc = new Account(); //객체타입 멤버변수는 new로 생성한 뒤 사용.
}
// 계좌 관련 클래스
class Account {
String name;
String num;
String pwd;
int money;
}
public class 객체배열카드 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Card3 c = new Card3();
c.name = "신한카드";
c.num = "246152346";
c.pwd = "1234";
c.acc.name = "신한은행";
c.acc.num = "3445_7534";
c.acc.pwd = "1234";
c.acc.money = 10000;
System.out.println("카드사: " + c.name);
System.out.println("카드번호: " + c.num);
System.out.println("카드비번: " + c.pwd);
System.out.println("계좌은행: " + c.acc.name);
System.out.println("계좌번호: " + c.acc.num);
System.out.println("계좌비번: " + c.acc.pwd);
System.out.println("잔금: " + c.acc.money);
}
}
(2) 상속관계
- 자바의 모든 클래스는 object 클래스 (부모클래스) 를 상속받음.
- object 클래스는 toString을 갖고 있음. (equals도!)
- toString(): 객체 설명 메서드. 객체의 중요 정보를 하나의 문자열로 반환.
Member m1 = new Member("aaa", "111", "asdf");
Member m2 = new Member("bbb", "222", "ghjk");
//toString(): 객체 설명 메서드. 객체의 중요 정보를 하나의 문자열로 엮어서 반환.
System.out.println(m1.toString());
System.out.println(m1);
System.out.println(m2);
===========================
(print)
addr.Member@7344699f
addr.Member@7344699f
addr.Member@6b95977
(package.class@참조값)
---- 메서드 오버라이드: 상속받은 데이터를 리폼.
Source > Override/Implement Methods...
@Override
public String toString() {
// TODO Auto-generated method stub
return super.toString();
}
...> 값 변환
@Override
public String toString() {
// TODO Auto-generated method stub
return "grfae";
}
...........> 출력
System.out.println(m1.toString());
================
(print)
grfae
- 출력 대용
이클립스의 Source > Generate toString()...
@Override
public String toString() {
return "Member [name=" + name + ", tel=" + tel + ", address=" + address + "]";
}
3-3) 클래스 역할 & 종류
- 기능 정의 -> 기능 명세 -> 객체 도출 -> 객체를 클래스로 정의
- 클래스: 한 객체의 정보를 묶어서 한 변수에 담도록 타입을 정의 --- 멤버변수(값 저장) + 메서드(기능)
- JAVA Web 개발은 mvc 패턴으로 개발.
mvc 패턴: m(model--VO, DAO, Service), v(view--HTML, CSS, JS), c(control--Servlet)
VO (Value Object) : 한 객체의 정보를 묶어서 한 변수에 담는 용도 ==> 캡슐화
- 하나의 객체만 담도록 (입력, 출력 따로 빼서 짜기) --> 재사용성 용이
- (ex) 카드: 카드 정보를 담는다 ==> vo (value object)
- VO = 값 저장하기 위한 멤버변수 + 멤버변수 값 세팅하는 메서드(setter) + 멤버변수 값 리턴하는 메서드(getter) + 출력메서드
로 구성됨.
- private 멤버변수 작성(데이터와 동일한 타입)
-> 생성자 자동 생성(Source>Constructor using..) & 디폴트 생성자 생성
-> setter, getter 자동 생성 (Source>Generate Getters...)
-> toString() 자동 생성(Source>Generate toString()..)
DAO (Databases Access Object) : DB처리. (DB)배열에 데이터 저장, 검색, 수정, 삭제
SERVICE : 비즈니스 로직 제공. 사용자에게 제공할 기능 구현
ex) 주소록
(class) Member VO
//vo : 값 저장 클래스
public class Member {
String name;
String tel;
String address;
public MemberVo() {
}
//멤버 변수에 값 할당하는 메서드 (메서드: 클래스 안에 들어와있는 함수)
//생성과 동시에 값을 넣어주기 위해서 파라메터있는 생성자 작성 (setter)
//setter: 파라메터로 받은 값을 멤버 변수에 할당
//setter 의 메서드 타입: void
public MemberVo(String name, String tel, String address) {
this.name = name;
this.tel = tel;
this.address = address;
}
//printData() 대용으로 활용
//Source > Generate toString()...
@Override
public String toString() {
return name + " / " + tel + " / " + address ;
}
}
(class) Member DAO
import java.util.Scanner;
//DB 접근 객체
//DB 나 배열같은 저장소와 연결된 작업 수행
public class MemberDao {
//저장소. DB역할. 생성은 생성자에서 함.
Member[] members; //배열 선언
MemberDao() { //생성자에서 배열 생성
members = new Member[30];
}
//데이터 개수 카운팅하는 변수
int cnt; //class는 자동초기화. 0.
//배열에 Member타입의 객체(m) 하나 추가
void insert(Member m) {
if (cnt >= members.length) {
System.out.println("배열참. 추가 취소");
return;
}
members[cnt] = m;
cnt++;
//검색.. 값 받아서. 순차탐색. 방 번호 리턴.
//삭제
}
}
(class) Member Service
import java.util.Scanner;
//Service: 사용자가 사용할 기능 제공 (like menu)
public class MemberService {
// dao 객체를 멤버로 선언
// 대부분 기능이 저장소에 저장하거나 읽는 작업이 포함됨
MemberDao dao; //변수선언
MemberService() { //생성자에서 객체 생성
dao = new MemberDao();
}
// 기능구현
// 추가: 한 사람의 이름, 전화, 주소를 입력받아 저장소에 저장.
// Scanner은 main에서 한 번만 만들고 필요할 때마다 불러오는 것이 심플하니 좋다.
void addMember(Scanner sc) {
System.out.println("name: ");
String name = sc.next();
System.out.println("tel: ");
String tel = sc.next();
System.out.println("addr: ");
String address = sc.next();
dao.insert(new MemberVo(name, tel, address));
}
// 이름으로 검색
// 수정
// 삭제
// 전체출력
void getAll() {
for (int i = 0; i < dao.cnt; i++) {
System.out.println(dao.members[i]);
}
}
}
(class) Main (실행창)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
MemberService service = new MemberService();
service.addMember(sc);
service.addMember(sc);
service.getAll();
}
}
=============================================
(print)
aaa / 1234 / 성남
ggg / 4567 / 수원시