반복구조

계속 반복해야 하는 상황

1) 조건에 맞는동안 계속 반복

 

2) 횟수가 정해진 반복

간단한 while-switch 문 예제

#include <stdio.h>
int calculator(int a, char op, int b)
{
    int result;
    switch(op){
        case '+':
            result=a+b;
            break;
        case '-':
            result=a-b;
            break;
        case '*':
            result=a*b;
            break;
        case '/':
            result=a/b;
            break;
        case '%':
            result=a%b;
            break;
        default:
            printf("잘못된 연산자를 입력했습니다.");
            return -1;
    }
}
void testCaluclator(void){
    int a, b, c;
    char op;
    printf("숫자 연사자 숫자 형식으로 입력하세요");
    scanf("%d %c %d", &a,&op,&b);
    
    c=calculator(a,op,b);
}
void testGrade(){
    int score;
    printf("input score");
    scanf("%d",&score);
    if(score>90) printf("A\n");
    else if(score >80) printf("B\n");
    else if(score>70) printf("C\n");
    else if(score>60) printf("D\n");
    else printf("F\n");
}
int leafyear(int year){
    if(((year%4==0)&&(year%100!=0))||(year%400==0))
        return 29;
    else
        return 28;
}
int daysofmonth(int month){
    int result,year;
    switch(month)
    {   if(month<1||month>12){
            printf("잘못된 입력입니다.");
            return -1;
    }
        case 2:
            printf("input year: ");
            scanf("%d",&year);
            result=leafyear(year);
            break;
        case 4:
        case 6:
        case 9:
        case 11:
            result=30;
            break;
        default:
            result=31;
    }
    return result;
}
void testDaysofmonth()
{
    int mon;
    printf("몇일인지 알고 싶은 월을 입력하세요 : ");
    scanf("%d",&mon);
    printf("%d월은 '%d일까지 있습니다",mon,daysofmonth(mon));
}
int main()
{
    int cont=1;
    int choice=0;
    
    while(cont)
    {
        printf("input choice : ");
        scanf("%d",&choice);
        switch(choice){
            case 1:
                testCaluclator();
                break;
            case 2:
                testGrade();
                break;
            case 3:
                testDaysofmonth();
                break;
            case -1:
                cont=0;
                break;
            default:
                printf("잘못된 입력입니다.");
        }
    }
    return 0;
}

 

'Computer engineering > C' 카테고리의 다른 글

반복문-While(3)  (0) 2021.05.03
반복문-While(2)  (0) 2021.05.02
If-else 조건문  (0) 2021.04.21
If 조건문  (0) 2021.04.11
4. 대입 및 산술 연산자  (0) 2021.04.01

버튼,텍스트뷰,에디트텍스트 등 안드로이드에서 사용하는 위젯은 레이아웃이라는 틀 위에 존재해야 한다. 레이아웃은 위젯을 배치하여 안드로이드 화면을 목적에 맞게 배열 할 수 있게 한다.

레이아웃의 기본 개념

레이아웃은 ViewGroup 클래스로부터 상속받으며 내부에 무엇을 담는 용도로 쓰인다.

레이아웃 중에서 가장 많이 사용되는 것은 리니어 레이아웃이며, 이를 선형 레이아웃이라고도 한다.

레이아웃에서 자주 사용되는 속성

-orientation: 레이아웃 안에 배치할 위젯의 수직 또는 수평 방향을 설정

-gravity: 레이아웃 안에 배치할 위젯의 정렬 방향을 좌측,우측,중앙 등으로 설정

-padding: 레이아웃 안에 배치할 위젯의 여백을 설정

-layout_weight:레이아웃이 전체 화면에서 차지하는 공간의 가중값을 설정하는데, 여러 개의 레이아웃이 중복될 때 주로 사용

-baselineAligned:레이아웃 안에 배치할 위젯을 보기 좋게 정렬

레이아웃도 View 클래스의 하위 클래스이므로 View 클래스의 XML속서오가 메서드를 모두 사용할 수 있다.

레이아웃의 종류

자주 사용되는 레이아웃은 리니어레이아웃(LinearLayout), 렐러티브레이아웃(RelativeLayout), 프레임레이아웃(FrameLayout), 테이블레이아웃(TableLayout), 그리드레이아웃(GridLayout)등이다.

*절대 좌푯값으로 지정하는 앱솔루트레이아웃(AbsoluteLayout)도 있었으나 해상도가 다른 안드로이드폰에서 문제가 발생하여 더 이상 사용하지 않는다.

레이아웃 종류

LinearLayout(선형 레이아웃)

레이아웃의 왼쪽 위부터 아래쪽 또는 오른쪽으로 차례로 배치

RelativeLayout(상대 레이아웃)

위젯 자신이 속한 레이아웃의 상하좌우 위치를 지정하여 배치하거나 다른 위젯으로부터 상대적인 위치를 지정한다.

TableLayout

행과 열의 개수를 지정한 테이블 형태로 위젯을 배열한다.

GreedLayout

테이블레이아웃과 비슷하지만 행 또는 열을 확장하여 다양하게 배치할 때 더 편리하다.

FrameLayout

위젯을 왼쪽 위에 일률적으로 겹쳐서 배치하여 중복되어 보이는 효과를 낼 수 있다. 여러 개의 위젯을 배치한 후 상황에 따라서 필요한 위젯을 보이는 방식에 주로 활용된다.

 

=>선형레이아웃만으로도 대부분의 레이아웃 형태를 구성할 수 있어 선형레이아웃의 사용도가 가장 높다. 그러므로 선형레이아웃만 잘 이해하면 다른 레이아웃도 쉽게 이해할 수 있다.

 

 

컴파운드버튼

CompoundButton 클래스는 Buttom 클래스의 하위 클래스로 체크박스, 라디오버튼,스위치,토글버튼의 상위 클래스이다.

이 네가지는 공통적으로 체크 또는 언체크 상태가 될 수 있다. (실제로 비슷한 형태를 띠지만 용도는 조금씩 다르다)

컴파운드버튼 계층도

체크박스

체크박스는 클릭할 때마다 상태가 체크,언체크로 바뀐다. 여러 개의 체크박스가 있어도 서로 독립적으로 동작한다는 특징이 있어 여러 개를 동시에 체크할 수 있다.

line4,11에서 checked 속성이 true로 되어 있는데, 이처럼 동시에 여러 개를 선택할 수 있다.

-setChecked() : 강제로 체크를 켜거나 끄는 메서드

-toggle(): 체크 상태를 반대로 바꾸는 메서드

-isChecked(): 체크되었는지를 확인하는 메서드

버튼에서 클릭 이벤트를 발생 시 OnClickListener를 사용했듯이, 체크박스에는 체크 또는 언체크 이벤트 발생 시 OnCheckedChangeListener를 사용할 수 있다.

체크와 언체크가 바뀌는 것의 처리과정(Java)

1.체크박스 변수 선언

CheckBox mycheck;

2.변수에 체크박스 위젯 대입

mycheck=(CheckBox) findViewById(R.id.android);

3.체크박스가 변경될 때 동작하는 클래스 정의

mycheck.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){

   public void onCheckedChanged(CompoundButton buttonView,boolean isChecked){

       //동작 내용을 이 부분에 코딩

   }

});

 

스위치와 토글버튼

스위치와 토글버튼은 모양만 조금 다를 뿐 용도는 거의 동일하다. 스위치의 주 용도는 on/off 상태 표시이다.

*컴파운드버튼(체크박스,라디오버튼, 스위치, 토글버튼 등)은 AVD 버전,SDK 버전, 테마 설정 등에 따라서 모양이나 색상이 조금씩 다르지만 기능은 동일하다.

checked 속성은 true와 false에 따라서 색상과 글자가 다르게 표현된다.

 

라디오버튼과 라디오그룹

라디오버튼은 XML속성이나 메서드가 체크박스와 거의 동일하지만 용도가 다르다. 성별을 선택하는 것처럼 여러 개 중 하나만 선택해야 하는 경우에 사용한다. 그러나 라디오버튼만 여러 개 나열하면 클릭하는 것마다 모두 중복 선택되므로 라디오그룹(RadioGroup)과 함께ㅔ 사용해야 한다.

 

라디오그룹은 ViewGroup_LinearLayout의 하위 클래스로 존재하며, 지금 사용하고 있는 TextView 하위의 위젯들과는 성격이 조금 다르다. 라디오 그룹은 대부분 라디오 버튼을 묶는 역할만 하므로 다음 예제만 이해하면 된다.

-clearCheck()

해당 라디오그룹 안에 체크된 것을 모두 해제해준다. line1~7의 라디오그룹으로 묶었기 때문에 이 라디오그룹 안의 모든 라이도 버튼은 한 번에 하나씩만 선택된다. 

각 라디오버튼 id속성이 꼭 있어야 한다. id 속성이 없으면 해당 라디오버튼이 계속 선택된 것으로 지정되어 해제되지 않는다.

 

이미지뷰와 이미지버튼

이미지뷰는 그림을 출력하는 위젯이다. 그림 파일은 일반적으로 프로젝트의 [res]-[drawable]폴더에 있어야 한다.

접근은 XML에서 "@drawable/그림 아이디" 형식으로 한다.

위 그림을 보면 ImageView 클래스는 View 클래스에서 바로 상속받기 때문에 앞에서 배운 TextView의 하위 위젯들과 속성이 조금 다르다. 특히 이미지와 관련된 속성과 메서드를 주의깊게 살펴볼 필요가 있다. ImageButton 클래스는 ImageView 클래스에서 상속받으며 거의 동일한 용도로 사용하지만 버튼처럼 클릭하는 데 쓰인다. 이미지버튼은 그림으로 표현된 예쁜 버튼을 만들 때 사용할 수 있다.

 

 

if 문에서는 조건이 참일 경우에만 처리를 하였지만 조건이 거짓인 경우에도 처리를 하여야하는 경우도 많다.

예를 들어 온도가 25도 이상이면 가벼운 옷차림을 하고 그렇지 않으면 두꺼운 옷차림을 선택한다고 하자. 이런 경우에 사용할 수 있는 문장이 if-else문이다. 

 

흐름도는 다음과 같다.

if-else 흐름도
if-else syntax

예제를보면 다음과 같다.

/******************************************************************************

Welcome to GDB Online.
GDB online is an online compiler and debugger tool for C, C++, Python, Java, PHP, Ruby, Perl,
C#, VB, Swift, Pascal, Fortran, Haskell, Objective-C, Assembly, HTML, CSS, JS, SQLite, Prolog.
Code, Compile, Run and Debug online from anywhere in world.

*******************************************************************************/
#include <stdio.h>

void eatLunch2(void){
    int money;
    
    printf("돈이 얼마 있나요?");
    scanf("%d",&money);
    if(money>=10000) printf("돈까스를 먹는다.\n");
    else if(money>=5000) printf("짜장면을 먹는다.\n");
    else if(money>=2500) printf("라면을 먹는다.\n");
    else printf("굶는다.\n");
    
}

int isLeafYear(int year)
{
    int result;
    if(year%4==0){
        if(year%100!=0)return 1;
        else if(year%400==0) return 1;
    }
    return 0;
    
}
int main()
{
    int year;
    eatLunch2();
    printf("올해는 몇년도인가요?");
    scanf("%d",&year);
    year=isLeafYear(year);
    if(year) printf("윤년입니다.year--> %d\n",year);
    else printf("윤년이 아닙니다.\n");
    return 0;
}



 

#include <stdio.h>

int main(void)
{
    int location,sex,age;
    printf("거주지- 서울:1, 경기:2, 충남:3");
    printf("성별-남자:1,여자:2");
    printf("나이-숫자로 입력(10대 미만, 10대,20대,30대 이상으로 구분)");
    scanf("입력순서대로 적으시오(거주지,성별,나이):%d %d %d", &location,&sex,&age);
    if((location=1)&&(sex=1)&&(age<10)) printf("서울거주 10대 미만 남자");
    else if((location=1)&&(sex=1)&&(age>10&&age<20)) printf("서울거주 10대 남자");
    else if((location=1)&&(sex=1)&&(age>20&&age<30)) printf("서울거주 20대 남자");
    else if((location=1)&&(sex=1)&&(age>30)) printf("서울거주 30대 이상 냠쟈");
    else if((location=1)&&(sex=2)&&(age>10&&age<20)) printf("서울거주 10대 여자");
    else if((location=1)&&(sex=2)&&(age>20&&age<30)) printf("서울거주 20대 여자");
    else if((location=1)&&(sex=2)&&(age>30)) printf("서울거주 30대이상 여자");
    else if((location=2)&&(sex=1)&&(age>10&&age<20)) printf("경기거주 10대 남자");
    else if((location=2)&&(sex=1)&&(age>20&&age<30)) printf("경기거주 20대 남자");
    else if((location=2)&&(sex=2)&&(age>30)) printf("경기거주 30대이상 남자");
    else if((location=2)&&(sex=2)&&(age>10&&age<20)) printf("경기거주 10대 여자");
    else if((location=2)&&(sex=2)&&(age>20&&age<30)) printf("경기거주 20대 여자");
    else if((location=2)&&(sex=2)&&(age>30)) printf("경기거주 30대이상 여자");
    else if((location=3)&&(sex=1)&&(age>10&&age<20)) printf("충남거주 10대 남자");
    else if((location=3)&&(sex=1)&&(age>20&&age<30)) printf("충남거주 20대 남자");
    else if((location=3)&&(sex=1)&&(age>30)) printf("충남거주 30대이상 남자");
    else if((location=3)&&(sex=2)&&(age>10&&age<20)) printf("충남거주 10대 여자");
    else if((location=3)&&(sex=2)&&(age>20&&age<30)) printf("충남거주 20대 여자");
    else if((location=3)&&(sex=2)&&(age>30)) printf("충남거주 30대이상 여자");
    
    return 0;
    
}

 

'Computer engineering > C' 카테고리의 다른 글

반복문-While(2)  (0) 2021.05.02
반복문-While(1)  (0) 2021.05.02
If 조건문  (0) 2021.04.11
4. 대입 및 산술 연산자  (0) 2021.04.01
3. #define이란?  (0) 2021.04.01

If 조건문 사용하기

if 조건문은 괄호 안에 조건식을 지정하여 사용한다.

if(조건식)
{
	코드
}

 

C언어에서 조건문은 if()형식으로 사용하며 ()안에는 조건식이 들어간다. 그리고 {}안에는 조건식이 만족할 때 실행할 코드를 넣어준다.

 

if 조건문의 기본형태

 

다음예제를 보자.

 

#include <stdio.h>
void eatLunch(void)
{
    int money=0;
    printf("돈이 있나요?(1-yes, 0-no) : ");
    scanf("%d",&money);
    if(money==1){
        printf("점심식사를 한다\n");
    }
}

void exam(void)
{
    int math, eng;
    printf("수학점수와 영어점수를 입력하세요: ");
    scanf("%d %d",&math,&eng);
    if(math>=80&&eng>=80){
        printf("갈비찜을 먹는다"); 
    }
}
int isLeafYear(int year)
{
    int result;
    result=((year%4==0)&&(year%100!=0))||(year%400==0);
    return result;
}
int main()
{
    int year;
    eatLunch();
    exam();
    printf("연도를 입력하세요: ");
    scanf("%d",&year);
    if(isLeafYear(year))  printf("%d년도는 윤년입니다.",year);
    printf("프로그램종료 .\n");
    return 0;
}

eatLunch() 함수를 살펴보면,

money변수를 0으로 지중해주고, 값을 입력받는다. 이후 if문을 활용해 money가 1이라면 '점심식사를 한다'를 그렇지 않다면 pass해주는 함수이다.

exam() 함수를 살펴보면,

math,eng변수를 선언해주고, 수학점수와 영어점수를 입력받는다. 이후 if문을 활용해 영어점수와 수학점수가 80점 이상이라면 '갈비찜을 먹는다'를, 그렇지 않다면 pass해주는 함수이다.

isLeafYear()함수를 살펴보면,

윤년을 확인하는 함수이고, result를 선언해준 후, result값이 4로 나누어떨어지고 100으로 나누어떨어지지 않으며 400으로 나누어떨어지면 윤년을 내보내준다.

이 과정을 main 함수에서 if 문을 통해 지정해주었다. 

if 조건문과 세미콜론

if 조건문을 사용할 때는 ;(세미콜론)을 항상 주의해야한다. 

다음 예제를 확인해보자.

#include <stdio.h>
 
int main()
{
    int num1 = 5;
 
    if (num1 == 10);    // if 조건문 끝에는 세미콜론을 붙이면 안 됨
    {
        printf("10입니다.\n");
    }
 
    return 0;
}

10입니다.

if 조건문 끝에 세미콜론이 붙어있다. 이렇게 되면 if는 제대로 동작하지 않고, 뒤에 오는 코드가 무조건 실행되어 버린다. 그래서 num1에는 5가 들어있기 때문에 "10 입니다."가 출력되면 절대 안되지만 출력된다.

 

if 조건문 끝에 세미콜론을 붙이면 실제로는 다음과 같은 코드가 된다.

if (num1 == 10);
 
printf("10입니다.\n");

if와 printf는 전혀 관계가 없이 떨어진 상태가 되므로 조건식이 어떻든 printf는 항상 실행된다. 

그런데 왜 컴파일 에러가 발생하지 않는가? C언어에서는 다음과같이 코드를 {}(중괄호)로 감쌀 수 있기 때문이다.

{
   printf("10입니다.\n");
}

printf를 중괄호로 감싸도 동작은 달라지지 않지만 변수를 선언하고 사용할 때는 약간의 차이가 있다.

 

if 조건문에서 중괄호 생략하기

if 조건문에서 실행할 코드가 한 줄이라면 다음과 같이 중괄호를 생략할 수 있다.

 

#include <stdio.h>
 
int main()
{
    int num1 = 10;
 
    if (num1 == 10)
        printf("10입니다.\n");    // 실행할 코드가 한 줄이라면 중괄호 생략
 
    return 0;
}

10입니다.

마찬가지로 if 조건문 끝에는 절대 세미콜론을 붙이면 안 된다.

if에 세미콜론을 붙이면 if printf는 관계가 없이 떨어진 상태가 된다. 즉, 중괄호 없이 한 줄로 코드를 만들면 관계가 없는 상태가 좀 더 명확하게 보일 것이다.

if에서 실행할 코드가 두 줄 이상일 때는 중괄호 생략에 주의하자.

#include <stdio.h>
 
int main()
{
    int num1 = 5;
 
    if (num1 == 10)
        printf("if 조건문\n");    // if에서 중괄호를 생략하면 첫 번째 줄만 실행됨
        printf("10입니다.\n");    // 중괄호가 없으므로 if의 결과와는 관계 없이 항상 실행됨
 
    return 0;
}

10입니다.

if로 실행할 printf가 두개인데도 중괄호를 생략하면 첫 번째 printf만 실행된다. 여기서는 num1에 5가 들어있으므로 조건식이 거짓이라 "if 조건문"은 출력되지 않지만, 뒤에 오는 printf는 if와 관계 없이 항상 실행되므로 "10입니다."가 출력된다.

 

if로 실행할 코드가 두 줄 이상이라면 반드시 중괄호로 묶어두자.

 

#include <stdio.h>
 
int main()
{
    int num1 = 5;
 
    if (num1 == 10)
    {   // if로 실행할 코드가 두 줄 이상이라면 중괄호로 묶어줌
        printf("if 조건문\n");
        printf("10입니다.\n");
    }
 
    return 0;
}

사용자가 입력한 값에 if 조건문 사용하기

이번에는 scanf함수를 사용해, 사용자가 입력한 값을 변수에 저장하고, if 조건문으로 값을 비교해보자.

#define _CRT_SECURE_NO_WARNINGS    // scanf 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>
 
int main()
{
    int num1;

    scanf("%d", &num1);    // 입력받은 값을 변수에 저장
 
    if (num1 == 10)             // num1이 10이면
    {
        printf("10입니다.\n");  // "10입니다."를 출력
    }
 
    if (num1 == 20)             // num1이 20이면
    {
        printf("20입니다.\n");  // "20입니다."를 출력
    }
 
    return 0;
}

소스를 컴파일 한후, 실행한 뒤 10을 입력하고 엔터 키를 누르자.

10 (입력)
10입니다.

입력 값이 num1에 저장되고 if로 num1이 10인지 비교하였다. 여기서는 10을 입력했으므로 "10입니다"가 출력된다. 

'Computer engineering > C' 카테고리의 다른 글

반복문-While(1)  (0) 2021.05.02
If-else 조건문  (0) 2021.04.21
4. 대입 및 산술 연산자  (0) 2021.04.01
3. #define이란?  (0) 2021.04.01
2. 수의 체계 -실수  (0) 2021.03.25

안드로이드에서 가장 기본적으로 사용되는 텍스트뷰, 버튼, 에디트텍스트를 보자. 

XML로 화면을 구성한 후 Java코드로 동작하는 기법을 익히자.

 

1. 텍스트뷰

텍스트뷰 계층도

텍스트뷰는 View 클래스 바로 다음에 위치하며 다양한 위젯이 그 하위에 존재한다.

텍스트뷰의 하위(에디트텍스트, 버튼,체크박스 등)는 모두 텍스트뷰로부터 상속받기 때문에 텍스트뷰의 속성을 잘 이해한다면 다른 위젯의 속성도 이해하기 쉬울 것이다.

text 속성

텍스트뷰에 나타나는 문자열을 표현한다. '문자열' 형식으로 값을 직접 입력하거나 "@string/변수명" 형식으로 설정한 후 strings.xml 파일에 지정할 수 있다.

 

[Tip]

안드로이드 메뉴얼에서는 activity_main_xml 파일에 문자열을 직접 입력하는 것보다 "@string/변수명" 형식의 사용을 권장한다. 이는 strings.xml의 내용만 수정하면 다른 언어로도 쉽게 변환할 수 있기 때문이다. 

textColor 속성

글자의 색상을 지정하며, background 속성처럼 같은 #RRGGBB나 #AARRGGBB 형식이다.

textSize 속성

글자의 크기를 dp,px,in,mm,sp 단위로 지정한다.

typeface 속성

글자의 글꼴을 지정한다. 값으로 sans,serif,monospace를 설정할 수 있고 default는 normal이다.

textStyle 속성

글자의 스타일을 지정한다. 값으로 bold, italic, bold|italic을 설정할 수 있고 default는 normal이다.

singleLine 속성

글이 길어 줄이 넘어갈 경우 강제로 한 줄까지만 출력하고 문자열의 맨 뒤에 '...'를 표시한다. 값으로 true와 false를 설정할 수 있고 디폴트는 false이다.

 

[Tip]

이 외에도 글자와 관련된 속성으로 textAllCaps, textAppearance, textColorHighlight, textColorHint, textColorLink, textlsSelectable, textScaleX 등이 있는데 활용도는 그닥 높지는 않다.

 

위 속성들을 다음 예제를 통해 살펴보자.

2. Java 코드로 XML 속성 설정

XML 속성은 View 클래스와 TextView 클래스에서 배운 것으로도 충분히 활용가능하다. 배우지 않은 것들도 거의 비슷한 형식이므로 쉽게 응용 가능하다. 다음 예에서는 activity_main.xml 파일에  지정한 xml 속성을 Java 코드에서 설정하는 법이다.

기본적인 텍스트뷰만 만들어 놓고 id 속성과 text만 설정한 XML 파일은 다음과 같다.

xml에서는 다음과 같이 처리해주고, Java 코드를 설정하여 화면에 적용해주자.

[Tip]

XML 속성과 메소드는 많은 위젯에서 거의 동일한 방식으로 활용된다. 

XML 속성과 관련 메서드1
XML 속성과 관련 메서드2

3. 버튼과 에디트텍스트

버튼과 에디트텍스트는 사용자에게서 어떤 값을 입력받기 위한 가장 기본적인 위젯으로 활용도가 높다.

두 위젯은 View 클래스와 TextView 클래스를 상속받으므로 거의 비슷하게 사용할 수 있다.

 

먼저, 간단한 텍스트뷰를 예로 살펴보면 다음과 같다.

위 텍스트뷰를 버튼으로 변경하려면 'TextView'를 'Button'으로만 바꾸면 된다.

필요시 TextView의 하위 클래스인 EditText, RadioButton, CheckBox, ToggleButton 등으로 바꾼다.

버튼

버튼에서는 버튼을 클릭하는 이벤트를 가장 많이 사용한다. 일반적인 버튼의 XML 코드는 다음과 같다.

이 버튼을 클릭했을 때 동작하는 Java 코드를 세 단계로 작성해준다.

1. 버튼 변수 선언

   Button mybutton;

2. 변수에 버튼 위젯 대입

   mybutton=(Button) findViewById(R.id.button1);
3. 버튼을 클릭할 때 동작하는 클래스 정의

   mybutton.setOnClickListener(new View.OnclickListener(){

             publick void onClick(View v){

             // 동작 내용을 이 부분에 코딩

            }

    });

위 세 단계는 대부분의 위젯(라디오버튼, 이미지버튼, 체크박스, 토글버튼 등)에서 거의 동일하게 사용되므로 통째로 외우는 것이 좋다. 

 

에디트텍스트

에디트텍스트는 값을 입력받은 후 해당 값을 Java 코드에서 가져와 사용하는 용도로 많이 쓰인다.

Java 코드에서 에디트텍스트에 값을 입력하는 경우도 종종 있다. 일반적인 에디트텍스트의 XML 코드는 다음과 같다.

에디트텍스트도 변수를 선언하고 이 변수에 해당 아이디 값을 넣은 후에 접근한다. 다음과 같은 형식을 많이 사용한다.

1. 에디트텍스트 변수 선언

   EditText myEdit;

2. 변수에 에디트텍스트 위젯 대입

   myEdit=(EditText) findViewById(R.id.edittext1);

3. 에디트텍스트에 입력된 값 가져오기->주로 버튼 클릭 이벤트 리스너 안에 삽입

   String myStr=myEdit.getText().toString();

 

getText() 메소드는 에디트텍스트에 입력한 값을 반환하는데, 이를 문자열로 바꾸기 위해 toString()을 함께 사용했다.

반환값을 문자열로 변경할 때 가장 많이 사용하는 방식이므로 잘 기억해두자.

 

초간단 계산기 앱 만들기

package com.example.a20160922;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    private EditText editText;
    private EditText editText1;
    private TextView textView;



    public class MyListener implements View.OnClickListener {

        @Override
        public void onClick(View v) {
            int a = Integer.parseInt(editText.getText().toString());
            int b = Integer.parseInt(editText1.getText().toString());

            double result = 0;
            if (v.getId() == R.id.buttonAdd)
                result = a + b;
            else if (v.getId() == R.id.buttonSub)
                result = a - b;
            else if (v.getId() == R.id.buttonMul)
                result = a * b;
            else
                result = (double)a / (double)b;

            textView.setText("계산 결과: " + result);
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editText = findViewById(R.id.editText1);
        editText1 = findViewById(R.id.editText);
        Button buttonAdd = findViewById(R.id.buttonAdd);
        Button buttonSub = findViewById(R.id.buttonSub);
        Button buttonMul = findViewById(R.id.buttonMul);
        Button buttonDiv = findViewById(R.id.buttonDiv);textView = findViewById(R.id.textView);

        MyListener listener = new MyListener();

        buttonAdd.setOnClickListener(listener);
        buttonSub.setOnClickListener(listener);
        buttonMul.setOnClickListener(listener);
        buttonDiv.setOnClickListener(listener);
    }
}

 

대입 및 산술연산자에 대해 알아보자.

 

연산자(Operator)  <= 명령어

1. 대입 연산자=> a=b => b의 값을 a에 대입한다.

 

2. 산술 연산자=> a+b => a와 b를 더한다.

나눗셈 시 주의사항은 다음과 같다.

단순히 4/3을 한다면 값은 1이 나온다. 우리가 원하는 값은 1.3333...을 원하는데 이 값이 아닌 정수를 뽑아낸다. 

그러므로 나눗셈 자체를 4.0/3.0으로 처리하여 실수로 계산할 수 있게 해줘야 한다.

코드를 예로 살펴보자.

 

#include <stdio.h>

int main(void){
    int big=0;
    int small=0;
    
    printf("작은수와 큰수를 각각 입력하시오");
    scanf("%d %d",&small,&big);
    
    printf("큰수를 작은수로 나눈 값: %d\n",big/small);
    printf("작은수를 큰수로 나눈 나머지 값: %d",small%big);
    
    return 0;
}

3. 관계 연산자=> a<b => b가 a보다 크다.

4. 논리 연산자=> a&&b => a와 b가 참(true)이다.

 

순서는 다음과 같다.

우선순위 같은 경우는 그래도 다 알아두시는게 좋다.

이제 이것들이 무엇을 의미하는지 알아보자.

 

1. 소괄호 () : 수학에서 괄호 속을 먼저 연산하는 것을 떠올리면 된다.

 

2. 콤마 연산자 : 성격이 동일한 자료형을 나열할 때 쓰인다.

 int num1, num2, num3, ... ;

 

3. 단항연산자 : 1개의 항에 대하여 연산을 해준다.

 3-1) 논리연산자 ! : 피연산자 a의 값이 거짓(0)이면 참(1)을, 그 외의 수는 거짓(0)을 반환한다. 사용법 [ !a ]

 3-2) 비트연산자 ~ : 피연산자 a를 bitwise(비트 반전) 시킨다. 즉, 1100 -> 0011. 사용법 [ ~a ]

 3-3) 증감연산자 ++, -- : 피연산자의 앞에 오냐(전위증가), 뒤에 오냐(후위증가)에 따라 의미가 약간 달라진다.

    ++a (전위증가) 의 경우 a를 1 증가시키고 나머지 연산을 시행하는 반면

    a++ (후위증가) 의 경우 연산을 모두 마친 후, 최종적으로 a를 증가시킨다.

 

    ※ 후위증가가 전위증가보다는 우선순위가 높다. 사용법 [ ++a, --a, a++, a-- ]

 3-4) sizeof(변수, 자료형) : 입력받은 변수 혹은 자료형의 크기를 byte 단위로 반환한다. 사용법 [ sizeof(int), sizeof(a) ]

 3-5) casting연산자 (자료형) : 명시적으로 자료형을 변환해준다. 낮은 곳에서 높은 곳으로 형변환(casting)이 될 때는 데이터 손실이 일어나지 않지만, 높은 곳에서 낮은 곳으로 형변환이 될 때에는 데이터 손실이 일어난다.

   (double)3 : 3이라는 숫자는 정수형이지만, double로 형변환 하여 3.0과 동일한 가치를 지닌다. 상위형변환 이므로 데이터 손실이 일어나지 않는다.

   (int)3.5 : 3.5라는 숫자는 실수형이지만, integer로 형변환 하여 3이라는 가치를 지닌다. 하위형변환 이므로 데이터 손실이 일어난다.

 

4. 산술연산자 : 뺄셈, 곱셈, 나머지연산 - 덧셈, 뺄셈 순으로 수학과 동일하다.

 a+b, a-b, a*b, a/b : 각 연산에 대한 결과 반환. 단, 5/2의 경우 2.5가 아니라 2가 된다. (int / int = int가 되는데 2.5는 double형이므로 하위형변환이 묵시적으로 일어남)

 a%b : a를 b로 나눈 나머지 값을 반환한다. 즉, 123%10 = 3이다.

 

5. 비트이동 연산자 <<, >> : a의 비트를 <<(좌측), >>(우측)으로 b만큼 비트를 이동한다. 밀려나는 값들은 사라지고, 새로운 자리에는 0이 들어온다.

 a << 2 : a의 비트가 00001110 이면 00111000이 된다.

 

 ※ 비트를 왼쪽으로 한 번 이동하는 것은 2를 곱하는 효과, 오른쪽으로 한 번 이동하는 것은 2로 나누는 효과를 가져온다.

 

6. 관계연산자 : 다음 식이 참이면 1을 반환, 거짓이면 0을 반환한다.

 a<b, a>b, a<=b, a>=b, a==b (같다 라는 표현은 =을 두개 사용하여 나타낸다), a!=b (a와 b가 다르다)

 

7. 비트논리연산자 : and, or, xor의 논리값을 반환한다.

 a&b : a와 b가 둘 다 참(1)일 때만 1을 반환한다. 그 외에는 0

 a|b : a와 b가 둘 다 거짓(0)일 때만 0을 반환한다. 그 외에는 1

 a^b : a와 b가 서로 다를 때 1을 반환한다. 그 외에는 0

 

 n bit에 대하여 n 비트 전부를 개별로 검사한다. 그리고 그 값을 개별적으로 반환하여 합하여 계산한다. 

즉, 11000000 & 01000001 = 01000000으로 반환한다. 이는 특정 비트를 검사할 때 매우 유용하다. 특정 비트가 검사된다면 왼쪽 예와 같이 0이 아닌 값을 반환하기 때문이다. 가령 예를 들어 하위 두번 째 비트가 1인지 아닌지 여부를 검사한다고 가정하자. 그러면

& 00000010을 주면 하위 두번 째 비트가 1일 경우에만 0이 아닌 수가 반환된다.

 

11111101 & 00000010 = 00000000 (거짓값 : 하위 두번 째 비트가 1로 세팅되어 있지 않다)

11100011 & 00000010 = 00000010 (참 값 : 하위 두번 째 비트가 1로 세팅되어 있다)

11000000 & 00000010 = 00000000 (거짓값 : 하위 두번 째 비트가 1로 세팅되어 있지 않다)

 

8. 논리연산자 : and, or의 논리값을 반환한다. 이 때에는 피연산자 자체가 0이 아닌 경우 참, 0인 경우 거짓을 나타낸다.

 a&&b : a와 b가 둘다 참일 때만 1을 반환한다. 11111101 && 00000010의 경우 둘 다 0이 아닌 수라 참의 값을 지니므로 결과는 참이 된다. 주로 관계연산자와 같이 사용된다. (a>=b) && (a>100) 와 같이 사용한다.

 a||b : a와 b가 둘다 거짓일 때만 0을 반환한다.

 

9. 조건연산자 : a? b: c 의 꼴이며, a가 참이면 b, 거짓이면 c를 반환한다.

 int max = (a>b)? a: b; 의 형태로 사용된다 // a가 b보다 크면 a, 작으면 b가 반환되서 max라는 변수에 할당이 된다.

 

10. 할당 및 복합 할당연산자 (오른쪽에서 왼쪽으로)

 a = b :  b의 값을 a에 저장한다.

 a += b, a = a+b 와 동일한 의미를 지닌다. a+b값을 a에 저장하라는것을 현재 a값에 b값을 더해 다시 a에 저장하라는 의미로도 해석하는것이다.

 a -= b, a = a-b 와 동일, a와b를 뺀값을 a에 저장하라는 의미이다.

 a *= b, a = a*b 와 동일, a와b를 곱한값을 a에 저장하라는 의미이다

 a /= b, a = a/b 와 동일, a와b를 나눈 몫을 a에 저장하라는 의미이다

 a %= b,a %= b 와 동일, a와b를 나눈 나머지를 a에 저장하라는 의미이다.

 

'Computer engineering > C' 카테고리의 다른 글

If-else 조건문  (0) 2021.04.21
If 조건문  (0) 2021.04.11
3. #define이란?  (0) 2021.04.01
2. 수의 체계 -실수  (0) 2021.03.25
1. 수의 체계 -보수  (0) 2021.03.25

C언어에서는 컴파일러에 특정 작업을 지시하는 전처리기(preprocessor)를 제공한다. 보통 전처리기는 반복되는 값이나 작업을 미리 정의할 때 사용하며 컴파일 옵션 설정이나 조건부 컴파일도 가능하다.

 

#define은 컴파일 직전에 처리되므로 전처리기에 명령한다.

바뀐 코드는 전처리기 과정 때 임시로 생성될 뿐 원본 코드에 영향을 주지 않는다.

 

다음 코드를 살펴보자.

#include <stdio.h>
#define PI 3.14

float circle_area(float r)
{
    return PI*r*r;
}

int main()
{
    printf("%f",circle_area(4));
    
    return 0;
}

다음을 해석해보면 

#define PI 3.14

는 'PI는 3.14라는 것을 정의해준다' 이다.

 

이해하기도 쉽고 간단하며 유용한 방법이다. 실제 저런 변수값은 정말 많이 쓰이는 경우가 많은데 하나하나 지정해서 써준다기보다는 메크로로 지정하여 주는게 이해하기도 쉽고 사용하기도 편리하다.

*보통 define 매크로는 대문자로 지정해준다(약속이다).

 

특히 상수값(잘 변하지 않는값)을 표현할때 많이쓰인다. 물론 상수 뿐만아니라 Array도 지정해줄 수 있다. 

 

 

전체 흐름도

 

 

 

'Computer engineering > C' 카테고리의 다른 글

If-else 조건문  (0) 2021.04.21
If 조건문  (0) 2021.04.11
4. 대입 및 산술 연산자  (0) 2021.04.01
2. 수의 체계 -실수  (0) 2021.03.25
1. 수의 체계 -보수  (0) 2021.03.25

실수의 저장 방법

int 정수(Integer)

변수 선언에 따라 각 값은 다음과 같다.

변수 선언 표

위 값보다 더 큰 경우를 사용하게 될 경우에는 어떻게 해야할까?

 

float, double(실수)를 선언해주어야 한다.

float은 4byte이다.

float(4byte)

double은 8byte이다. 엄청나게 큰 수를 저장할 수 있다.

double(8byte)

float과 double은 저장방식이 다르다. 다음 그림을 보자.

우선 float부터 보자.

 

float의 저장 공간 시각화

floating point(점이 떠다닌다)는 의미는 float의 약자이다. 즉, 소수 점이 자리를 이동하면서 떠다닌다는 의미를 갖는다.

그렇기에 정수표현식으로 변환하여 저장한다.

32.46=>3.245*10^1 

즉, 4 앞에 있는 소수점을 한자리 앞으로 옮겨줌으로써 10^1을 곱해준다.

결국 지수부와 가수부는 각자 따로 저장된다.

다른 예로,

0.0000003245=>3.245*10^-7 

이또한 10^-7은 지수부에서 옮겨지고, 3.245는 가수부에서 처리된다.

 

float형 실습

 

#include <stdio.h>

int main()
{
    //pi: 3.1415926538979
    float pi=3.1415926538979f;
    
    printf("%f",pi);

    return 0;
}


3.141593

float형은 6자리까지 밖에 출력을 안해준다. 더 보고싶다면

printf("%.20f",pi);로 변경해주어야 한다. 그러면 소수점이 20자리까지 나올 것이다.

 

#include <stdio.h>

int main()
{
    //pi: 3.1415926538979
    float pi=3.1415926538979f;
    
    printf("%.20f",pi);

    return 0;
}

3.14159274101257324219

 

가만히 보니 값이 조금 다르다. 이는 값의 저장방식이 다르기 때문에 변형된것이다.

제대로 된 값을 찾고 싶으면 double 형을 사용하면된다.

 

정리해보면,

-float은 출력시 %f 

-float은 값 설정시 예를들어 2000이면 2000.0f 를지정해준다.

-float은 값이 어느정도 커지면 값이 정확하게 출력이 안된다.

-double은 출력시 %lf

-double은 어느정도 float보다는 값이 정확하지만(64bit이기 때문), 이또한 값이 더 커진다면 정확하게 출력이 안된다.

-int는 출력시 %d

 

 

'Computer engineering > C' 카테고리의 다른 글

If-else 조건문  (0) 2021.04.21
If 조건문  (0) 2021.04.11
4. 대입 및 산술 연산자  (0) 2021.04.01
3. #define이란?  (0) 2021.04.01
1. 수의 체계 -보수  (0) 2021.03.25

보수를 활용하여 -값을 표현한다.

 

보수(Complement): 보완해서 완전하게 만들어 주는 수(보완제, 보어 등)

 

이산수학에서 등장한다.

 

*10진수 6: 6에 대한 10의 보수는 4 -> 1 0 

*10진수 46: 46에 대한 10의 보수는 54 ->1 0 0

*2진수 1: 1에 대한 2의 보수는 1 -> 1 0

 

 

보수의 성질: 어떤 수의 보수는 그 수의 음수 표현으로 나타낼 수 있다.

 

*1234-234=1000  -> 1234+(-234)=1000

->(보수화) 1234+0324의 10의 보수

각 자리를 0으로 만드는 수(네자리 수 연산임을 유의한다)

각 자리를 9로 만드는 수(9의 보수 +1)

 

즉, 0324+9765+1=10000

9765+1=9766

 

결국 9766은 234의 음수 값이 된다.

9763은 0234의 10의 보수

 

그러므로 1000이 남는다.

즉, 어떤 수의 보수를 취하면 그 수는 -성질을 띈다.

 

2진수로 연산

23-6=17

 

23의 2진표기
6의 2진표기

(보수화)

-6의 2진표기

각 자리를 모두 0으로 만든다(2의 보수)=>각 자리를 모두 1로 만든 후, +1을 해준다(1의 보수).

 

1을 더한 값

제일 앞 자리가 1이면 음수이다.

결국, 23+(-6)은 다음과 같다.

총 값은 17이 된다. 

 

 실제 컴퓨터에는 뺄셈 연산 기능이 없다.

컴퓨터는 2의 보수법을 활용해 음수를 저장한다. 즉, 보수를 취해 더해버린다.

 

연습문제

 

 

[출처: 선복근 교수님의 C Programming 강의]

'Computer engineering > C' 카테고리의 다른 글

If-else 조건문  (0) 2021.04.21
If 조건문  (0) 2021.04.11
4. 대입 및 산술 연산자  (0) 2021.04.01
3. #define이란?  (0) 2021.04.01
2. 수의 체계 -실수  (0) 2021.03.25

1. View의 개요

1. View와 View Group

안드로이드 화면에서 실제로 사용되는 것들은 모두 View라는 클래스의 상속을 받는다.

뷰 클래스는 '위젯'이라고도 하는데, 쉽게 말해 화면에서는 버튼을 버튼 위젯, 시제 코드에서는 버튼 클래스라고 부른다.

또한, 다른 위젯을 담을 수 있는 위젯을 특별히 레이아웃이라 하며, 레이아웃은 ViewGroup이라는 클래스 아래에 존재한다.

위젯과 레이아웃

그러나 위젯은 단독으로 존재하지 않으며, 위젯을 담아 배치하는 틀이 바로 레이아웃이다.

레이아웃은 위젯을 포함하는 컨테이너 역할을 하므로 눈에 보이는 개념이 아니다.

위젯은

-넓은 의미로 View 클래스 하위의 모든 클래스를 지칭. 

-좁은 의미로 레이아웃 이외의 클래스를 지칭.

 

View 클래스 계층도

안드로이드에서 View 클래스의 상속을 받은 클래스(위젯) 계층도의 일부를 살펴보자.

안드로이드의 View 클래스 계층도

위 그림을 보면 최상단에 Object 클래스가 있고, 이를 상속받은 View 클래스가 있다.

안드로이드 화면에 나타나는 모든 위젯은 View 하위에 존재한다. 

레이아웃은 ViewGroup을 상속받은 LinearLayout, RelativeLayout, FrameLayout,GridLayout,TableLayout을 지칭한다.

뷰 컨테이너는 ListView,GridView,TabHost,Gallery 등이 있다. 뷰 컨테이너도 ViewGroup 클래스에서 상속받는다.

 

2. View 클래스의 XML 속성

View 클래스의 XML 속성은 수십 개가 넘으니 자주 사용할 것만 살펴보자. 다음은 Button의 기본 형태이며 View 클래스로부터 상속받았다.

버튼의 id,layout_width 등 몇 가지 기본적인 XML 속성이 표현되었다. 이러한 속성을 하나씩 살펴보자.

id 속성

id 속성은 모든 위젯의 아이디를 나타낸다. java 코드에서 버튼 등의 위젯에 접근할 때 id 속성에 지정한 아이디를 사용한다. 일반적으로 id 속성은 위젯에 아이디를 새로 부여하는 개념이므로 '@+id/' 형식으로 지정한다. 그 다음 새로 지정할 아이디를 넣는다. "@+id/btn1"

 

위젯에 접근하기 위해 Java 코드에서 다음과 같은 형식을 사용한다.

 

위 버튼 예제는 Java 코드에서 다음과 같은 접근 방식을 사용할 수 있다.

Button, RadioButton,CheckBox 등의 위젯은 일반적으로 클릭 또는 터치했을 때, 어떤 동작을 하기 위한 것이므로 id 속성을 지정한다. 

하지만, 클릭이나 터치를 해도 아무 동작이 필요없는 글자(텍스트뷰)나 배경 이미지(이미지뷰)등은 굳이 id 속성을 지정하지 않아도 된다.

 

예제 4-1 id 속성의 XML 코드

layout_width, layout_height 속성

layout_width,layout_height 속성은 모든 위젯에 필수로 들어간다. 매우 중요하다.

이 둘은 각각 위젯의 너비와 높이를 나타내며 match_parent 와 wrap_content 값으로 설정할 수 있다.

match_parent: 이름 그대로 자신의 부모(대개는 레이아웃)에 너비나 높이를 맞춘다는 의미.

wrap_content: 글자가 꼭 들어갈 정도로 자신의 너비나 높이를 설정한다는 의미.

 

버튼의 경우 그 안에 들어갈 것이 글자이기 때문에 글자가 곡 들어갈 정도라고 표현했다. 하지만 다른 위젯에는 글자 외의 것이 들어간다. 예를 들면 이미지뷰에는 이미지가 들어가고 wrap_content는 이미지가 꼭 들어갈 정도로 너비나 높이가 설정된다.

 

예제를 살펴보자.

위 예제들에서 볼 수 있듯이 layout_width 속성에 wrap_content 값을 사용하면 버튼의 너비가 그 안의 글자인 '버튼입니다'에 꼭 맞는 크기가 되고, match_parent(또는 fill_parent)값을 사용하면 '버튼입니다' 글자와 관계없이 버튼을 싸고 있는 부모(linear_layout)의 너비에 꽉 차는 크기가 된다. 

 

값을 숫자로 직접 지정할수는 있지만 단위에 주의해야 한다. 가장 단순한 방법이 px(PiXel)단위이다. 

 

background 속성

background 속성은 위젯의 색상을 주로 #RRGGBB 값으로 지정한다. 각 값은 Red, Green, Blue를 의미하며 RR,GG,BB의 위치는 16진수 00~FF로 표현할 수 있다. 예를 들면 빨간색은 #FF0000, 파란색은 #0000FF로 지정한다. 값을 적절히 조합하면 필요한 색을 만들 수도 있다.

예제를 살펴보자.

위 예제는 레이아웃을 빨간색(#ff0000), 버튼을 초록색(#00ff00)으로 표현했다.

 

색상을 지정하기 위해 #AARRGGBB 방식을 사용할 수도 있다. AA는 알파 값으로 투명도이다. 00~FF로 지정할 수 있는데 00은 완전 투명을, FF는 완전 불투명을 나타낸다. 

즉, #FF0000FF는 불투명파랑, #000000FF는 완전 투명이므로 색상이 나타나지 않는다. #770000FF는 반투명 파란색이다.

 

padding, layout_margin 속성

padding 속성을 사용하여 위젯의 경계선으로부터 위젯 안의 요소가 떨어지게 설정할 수 있다. 기본적으로는 레이아웃 내에 버튼, 텍스트 뷰 등을 여러 개 두었을 때 레이아웃의 경계선에 딱 붙어서 표현되는데, padding 속성을 사용하면 레이아웃의 경계선과 위젯 사이에 여백을 둘 수 있다.

우선 텍스트뷰, 에디트텍스트, 버튼이 있는 XML 파일을 살펴보자.

 

위 코드를 이용해 결과를 살펴보면 경계선에 붙어 있어 답답해 보인다. 레이아웃에 padding 속성을 사용해보자.

*padding 은 상하좌우 모두에 지정하는 속성이다. 각각 따로 지정하고 싶으면 paddingTop, paddingBottom, paddingLeft,paddingRight를 이용한다.

LinearLayout에 지정된 padding속성 때문에 그 안의 요소들의 경계선에서 30dp만큼 떨어져 출력되었다.

위 에제는 LinearLayout에 padding을 설정했지만, Button에 padding을 설정하면 버튼 안의 글자가 버튼의 경계선에서 일정 간격 떨어져서 표현된다. 이와는 반대로 위젯과 위젯 사이에 여유를 두고 싶다면 layout_margin 속성을 사용하자.

*layout_margin은 상하좌우 모두에 지정하는 속성이다. 각각 따로 지정하고 싶으면 layout_marginTop, layout_marginBottom, layout_marginLeft,layout_marginRight를 이용한다.

 

예제 4-12 layout_margin 속성의 XML 코드

정리하면 padding 속성에는 자신의 내부에 들어 있는 위젯과 자신의 경계선 사이 간격을 지정하고, layout_margin 속성에는 자신과 부모 레이아웃이나 위젯 사이의 간격, 주위 다른 위젯과 간격을 지정한다. 따라서, layout_margin은 각 위젯의 속성으로 지정해야 한다.

 

Visibility 속성

visibility 속성으로 위젯을 보일 것인지 여부를 설정할 수 있다. 세 가지 값을 지정할 수 있는데 디폴트인 visible은 보이는 상태, invisible과 gone은 안 보이는 상태이다. 

invisible과 gone의 차이는, invisible은 보이지 않을 뿐 원래의 자리를 계속 유지하지만 gone은 그 자리까지 아예 내놓는다는 것이다.

 

visibility 속성은 XML 보다 Java 코드에서 상황에 따라 동적으로 필요한 버튼 등을 보이거나 안보이게 하는 경우에 주로 활용된다.

Enabled, Clickable 속성

위젯의 동작 여부는 enabled 속성으로 설정한다.

클릭이나 터치가 가능하게 하는 것은 clickable 속성으로 설정한다.

값은 true와 false로 지정하며 디폴트 값은 true 이다. enabled, clickable 속성은 XML 보다 Java 코드에서 주로 사용한다.

Rotation 속성

rotation 속성은 위젯을 회전시켜 출력하며 값은 각도로 지정한다. 특별 화면을 만들 때 사용한다.

지금까지는 많이 사용되는 XML 속성을 살펴보았다. 이 외에도 상당히 많지만 필요할 때마다 설명하겠다.

 

 

[자료 출처: Android Studio를 활용한 안드로이드 프로그래밍(6판)] 

에러가 나오는 원인

get_config라는 함수가 없기때문.

callback 함수를 사용해 모델을 저장하려하는데 위 에러 발생

callback 함수를 사용하지 않고 model.fit을 하는 경우에는 위 에러가 발생하지 않는다.

 

해결 방법

model class 내에 get_config라는 함수를 만들어 주면 된다.

def get_config(self):
    config=super().get_config().copy()
    return config

 

참고URL:stackoverflow.com/questions/58678836/notimplementederror-layers-with-arguments-in-init-must-override-get-conf

OMP: Hint This means that multiple copies of the OpenMP runtime have been linked into the program. That is dangerous, since it can degrade performance or cause incorrect results. The best thing to do is to ensure that only a single OpenMP runtime is linked into the process, e.g. by avoiding static linking of the OpenMP runtime in any library. As an unsafe, unsupported, undocumented workaround you can set the environment variable KMP_DUPLICATE_LIB_OK=TRUE to allow the program to continue to execute, but that may cause crashes or silently produce incorrect results. For more information, please see

 

파이참에서는 다음과 같은 에러코드가 나오지만 jupyternotebook에서는 오류가 나오지않는다.

단순 shutdown....

그러므로 이를 확인하기 위해서는

 

jupyter notebook --debug

위와 같이 debug옵션을 주어 실행하면 문제점 확인가능.

 

해결법은 간단하다.

 

import os

os.environ['KMP_DUPLICATE_LIB_OK']='True'

 

혹은,

>conda install nomkl

작성해주자.

 

 

 

[출처]fredriccliver.medium.com/%EC%97%90%EB%9F%AC-omp-error-15-initializing-libiomp5-dylib-but-found-libiomp5-dylib-already-initialized-2bcc0033dc83

+ Recent posts