당신은 주제를 찾고 있습니까 “계산기 앱 만들기 – 앱인벤터 7강 계산기 앱 만들기“? 다음 카테고리의 웹사이트 https://you.maxfit.vn 에서 귀하의 모든 질문에 답변해 드립니다: https://you.maxfit.vn/blog/. 바로 아래에서 답을 찾을 수 있습니다. 작성자 피터팬 덕이쌤 이(가) 작성한 기사에는 조회수 7,556회 및 좋아요 47개 개의 좋아요가 있습니다.
계산기 앱 만들기 주제에 대한 동영상 보기
여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!
d여기에서 앱인벤터 7강 계산기 앱 만들기 – 계산기 앱 만들기 주제에 대한 세부정보를 참조하세요
계산기 앱 만들기 주제에 대한 자세한 내용은 여기를 참조하세요.
[Android] 계산기 앱 만들기 (안드로이드, 계산기 애플리케이션 …
[Andro] 계산기 앱 만들기 (안드로이드, 계산기 애플리케이션, 후위 표기법, Calculator, infix, postfix). Bbaktaeho 2020. 9. 14. 18:27.Source: bbaktaeho-95.tistory.com
Date Published: 12/23/2021
View: 7305
[안드로이드] 계산기 어플 앱 만들기 with 코틀린
이번에 진행한 프로젝트는 안드로이드 계산기 어플리케이션 만들기입니다. 간단하게 사용자가 입력한 식을 연산할 수 있고 계산 기록을 확인할 수 있는 …
Source: whyprogrammer.tistory.com
Date Published: 2/14/2022
View: 1783
안드로이드 스튜디오 초 간단 계산기 앱 만들기
테이블 레이아웃을 이용하여 숫자 버튼을 만들어서 앱을 제작해 보겠습니다. 별 다른 코드 안 들어가고 아주 간단한 계산기 예제 이므로 쉽게 따라하실수 …
Source: deumdroid.tistory.com
Date Published: 4/4/2021
View: 7383
간단한 계산기 앱 만들기(Android, 자료구조-후위표기식)(1)
간단한 계산기 앱 만들기(Andro, 자료구조-후위표기식)(1). 유령2세 2020. 2. 18. 16:56. 이번에는 안드로이드 스튜디오를 이용해서 만든 간단한 계산기 앱을 보여 …
Source: dirrito.tistory.com
Date Published: 10/17/2021
View: 3363
[안드로이드 스튜디오] 기초 완전 간단한 계산기 앱 만들기!
안녕하세요 간단한 계산기 앱을 만드는 방법에 대해 알아보도록 하겠습니다! 먼저 구성에 대해 알아보도록 하겠습니다. EditText 2개 = 값을 계산 할 숫자 …
Source: engineering-mino.tistory.com
Date Published: 6/14/2022
View: 2671
안드로이드 앱 만들기 계산기 흉내 내보기
자료출처 : stackoverflow.com/questions/26533347/format-currency-string-using-edittext-in-andro Format currency string using EditText in …
Source: billcorea.tistory.com
Date Published: 1/27/2021
View: 707
[iOS 어플 만들기] 계산기 만들기 도전 2일차(아이폰계산기 클론 …
프린트되는 라벨이 이상하게 나오지 않게 연산이나 숫자 입력할 때 오류 없이 만들기. 레이아웃 비교. 아이폰 계산기. 내가 만든거. (이 정도면 비슷하지 …
Source: velog.io
Date Published: 11/17/2022
View: 3187
주제와 관련된 이미지 계산기 앱 만들기
주제와 관련된 더 많은 사진을 참조하십시오 앱인벤터 7강 계산기 앱 만들기. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.
주제에 대한 기사 평가 계산기 앱 만들기
- Author: 피터팬 덕이쌤
- Views: 조회수 7,556회
- Likes: 좋아요 47개
- Date Published: 2020. 4. 26.
- Video Url link: https://www.youtube.com/watch?v=A6zmDpleKCo
[Android] 계산기 앱 만들기 (안드로이드, 계산기 애플리케이션, 후위 표기법, Calculator, infix, postfix)
반응형
2020-09-14 수정 : (우리가 일상에서 이용하는 수식은 중위 표기법입니다)
들어가며
자바 언어를 검색을 통해서 익히다 보니 어떤 util이 더 좋은지 아직 감이 안 잡혔고 메서드를 만들어 사용하는 것도 많이 부족합니다.
때문에 자바 언어가 많이 미숙해서 코드가 좋지 못한 점 양해 부탁드립니다.
제가 구현한 코드는 답이 아닙니다. 참고로만 봐주시면 감사하겠습니다.
이번에 만들어볼 계산기는 윈도우 계산기입니다.
윈도우 계산기 안드로이드 계산기 (최대한 비슷하게 해봄ㅋㅋ)
간단한 연산만 할 수 있도록 구현하겠습니다.
참고로 계산기를 구현하는 것은 쉬운 일이 아닙니다. 저 역시 구현하면서 논리적인 생각, 자료구조를 떠올리며 많은 노력을 쏟았습니다.
프로젝트 생성
bbaktaeho-95.tistory.com/57
위의 포스팅에서 프로젝트 생성과 Splash 구현까지 그대로 따라 하면 됩니다.
res/values/colors.xml
프로젝트에서 사용할 색상을 먼저 작성합니다.
#000000 #FFFFFF #E6E6E6 검은색, 흰색, 회색을 추가했습니다.
res/values/styles.xml
화면에 보일 스타일을 따로 작성했습니다.
메인 파일에서 추가하지 않고 어떻게 해야 스타일을 적용시킬 수 있을까 찾아보다가 styles.xml 에서 원하는 스타일을 작성하면 layout들의 스타일, 테마까지 쉽게 적용시킬 수 있었습니다.
Splash 화면, Main 화면에 적용시킬 스타일만 작성했습니다.
res/layout/activity_main.xml
이제 UI를 만들어보겠습니다.
가장 먼저 루트 레이아웃으로 LinearLayout을 선택했고 그 안에 RelativeLayout, TableLayout 으로 구현했습니다.
각 TableRow에 버튼을 균형적으로 배치할 수 있도록 TableLayout의 속성 값으로 android:stretchColumns=”*” 옵션을 추가했습니다.
하나의 TableRow에 들어있는 Button들입니다.
여기서 버튼에 onClick 속성이 있는데 자바, 코틀린 코드에서 리스너 메서드를 구현하지 않아도 각 뷰 컴포넌트들에게 직접적으로 메서드를 연결할 수 있었습니다.
이러한 방법을 추천하지 않는다고 하지만 단순히 어떤 버튼이 클릭되었는지만 아는 기능뿐이고 메인 코드가 줄어드는 장점이 있기 때문에 적용했습니다.
다음은 수식과 결과가 나오는 TextView입니다.
여기는 RelativeLayout을 이용해서 구현했습니다.
MainActivity.java
앞서 말씀드렸던 onClick 속성을 적용하려면 View 타입의 매개변수가 있는 메서드를 선언해야 합니다.
public void buttonClick(View v) {…}
특히 public 제어자로 선언하지 않으면 사용할 수 없습니다. (엄청 삽질함)
자꾸 새로 만들라는 경고 메시지만 나옵니다.
다음은 MainActivity 클래스의 필드입니다.
private TextView txtExpression; private TextView txtResult; private List
checkList; // -1: 이콜, 0: 연산자, 1: 숫자, 2: . / 예외 발생을 막는 리스트 private Stack operatorStack; // 연산자를 위한 스택 private List infixList; // 중위 표기 private List postfixList; // 후위 표기 TextView들은 수식과 계산 결과 UI입니다.
나머지 스택과 리스트는 계산, 예외 처리를 하기 위한 필드입니다.
다음으로 전체 MainActivity 클래스의 메서드들입니다.
예외나 추가적인 기능을 처리하느라 메서드가 많아지고 서로 연관성이 좀 생겼습니다..
전체 코드는 깃허브 링크로 공유하겠습니다. 포스팅에서 몇 가지 메서드들만 다뤄보겠습니다.
init()
// 필드 초기화 void init() { txtExpression = findViewById(R.id.txt_expression); txtResult = findViewById(R.id.txt_result); checkList = new ArrayList<>(); operatorStack = new Stack<>(); infixList = new ArrayList<>(); postfixList = new ArrayList<>(); ActionBar actionBar = getSupportActionBar(); assert actionBar != null; actionBar.hide(); }
필드들을 초기화하고 ActionBar를 숨김 처리합니다.
getWeight(String)
// 연산자 가중치 (우선순위 *,/,%,+,-) int getWeight(String operator) { int weight = 0; switch (operator) { case “X”: case “/”: weight = 5; break; case “%”: weight = 3; break; case “+”: case “-“: weight = 1; break; } return weight; }
연산자의 우선순위에 따라 가중치를 부여하는 메서드입니다.
후위 표기법으로 나타낼 때 가장 중요한 역할을 합니다.
infixToPostfix()
// 전위 -> 후위 void infixToPostfix() { for (String item : infixList) { // 피연산자 if (isNumber(item)) postfixList.add(String.valueOf(Double.parseDouble(item))); // 연산자 else { if (operatorStack.isEmpty()) operatorStack.push(item); else { if (getWeight(operatorStack.peek()) >= getWeight(item)) postfixList.add(operatorStack.pop()); operatorStack.push(item); } } } while (!operatorStack.isEmpty()) postfixList.add(operatorStack.pop()); }
중위 표기법을 후위 표기법으로 변환하는 메서드입니다.
미리 저장했던 infixList(중위 표기법)에서 operatorStack을 이용해 연산자 우선순위에 따라 postfixList(후위 표기법)에 추가합니다.
출처 : https://wayhome25.github.io/cs/2017/04/18/cs-22/ 설명이 한 번에 이해되서 가지고 왔습니다.
calculate()
// 계산 String calculate(String num1, String num2, String op) { double first = Double.parseDouble(num1); double second = Double.parseDouble(num2); double result = 0.0; try { switch (op) { case “X”: result = first * second;break; case “/”: result = first / second;break; case “%”: result = first % second;break; case “+”: result = first + second;break; case “-“: result = first – second;break; } } catch (Exception e) { Toast.makeText(getApplicationContext(), “연산할 수 없습니다.”, Toast.LENGTH_SHORT).show(); } return String.valueOf(result); }
실질적인 계산을 하는 메서드입니다.
결과 값을 문자열로 변환하고 리턴해줍니다.
실행
동영상은 팝업창 또는 전체 화면으로 봐주세요.
GitHub
github.com/bbaktaeho/all-my-studies/tree/56999b73e76c0b3bbff89a3c5f22d3c0ef8937fe/android/Calculator/app/src/main/java/com/example/calculator
참고 자료
recipes4dev.tistory.com/126
wayhome25.github.io/cs/2017/04/18/cs-22/
recipes4dev.tistory.com/55
반응형
[안드로이드] 계산기 어플 앱 만들기 with 코틀린
1. 안드로이드 계산기 어플 앱 만들기 with 코틀린
이번에 진행한 프로젝트는 안드로이드 계산기 어플리케이션 만들기입니다. 간단하게 사용자가 입력한 식을 연산할 수 있고 계산 기록을 확인할 수 있는 기능을 가진 앱을 만들어보았습니다.
특징
사용자가 입력한 식 더하기, 빼기, 곱하기, 나누기, 나머지 연산
식 Clear 기능
계산 히스토리 확인 가능 및 기록 초기화 기능
room을 사용한 로컬 DB: 종료 후 재실행 하여도 계산 기록 저장
사용된 프로젝트 전체 코드는 저의 깃허브 저장소에서 확인이 가능합니다.
마찬가지로 이번 글에서도 프로젝트를 진행하며 작성된 모든 코드를 기록하는 방식이 아닌 제가 느끼기에 생소한 기술들이나 참신했던 코드 위주로 요약해서 다음에 참고해서 개발이 가능하도록 작성하도록 하겠습니다.
1.2. 해당 프로젝트에 사용된 기술 및 자원
레이아웃 TableLayout 사용 ConstraintLayout 사용 LayoutInflater 사용
Thread 사용 메인 스레드 이외 타 Thread 만들어서 사용하기 runOnUiThread 사용하기
Room 사용하기
Kotlin 확장 함수 사용 data class 사용
2. TableLayout 으로 계산기 버튼 구성하기
우리가 보통 사용하는 계산기 어플과 마찬가지로 5행 4열로 구성한 테이블 레이아웃을 사용해서 연산자 및 숫자 그리고 기능 버튼들을 추가하였습니다.
shrinkColumns
이때 android:shrinkColumns=”*” 속성으로 테이블 행의 너비가 테이블 레이아웃을 넘어버리는 경우 해당 열의 길이를 자동으로 줄여서 테이블 레이아웃의 전체 너비를 벗어나지 않도록 할 수 있습니다.
* 를 사용해서 전체 열에 대해서 설정을 해준 모습입니다. 0 베이스로 만약에 첫번째 세번째 열을 자동으로 조절하겠다 하면 “0,2” 를 값으로 주면 되겠죠?
androidx.appcompat.widget.AppCompatButton
버튼 대신에 AppCompatButton을 사용한 이유는 기본 테마로 지정된 보라색 버튼 말고 우리는 하얀 바탕의 배경의 검은색 텍스트를 기반으로한 버튼을 아용하기 위해서입니다. 또한 android:stateListAnimator=”@null”를 사용해서 애니메이션을 제거해줄 수도 있습니다.
뷰 바인드로 버튼 이벤트 처리
각각의 버튼에 사용된 onClick 속성으로는 모두 buttonClicked 함수를 지정해서 buttonClicked 함수 내부에서 해당 뷰의 id를 가져와서 각각에 해당하는 id에 맞는 기능을 수행하도록 when 문을 사용해서 정의해주었습니다.
여기서 들었던 궁금증 그런데 저렇게 buttonClicked 라는 명칭만으로 어떻게 MainActivity.kt 코드에 있는 함수를 참조할까 생각해보니 아무래도 매니페스트 파일에 있는 메인 엑티비티의 name 부분에 있는 .MainActivity 라는 명칭을 가지고 참조하게 될 거란 것을 추측할 수 있었습니다.
2.1. 특정 화면 비율로 뷰 나누기
보통 계산기 화면을 보면 키패드 부분의 영역이 계산식과 결과가 표시되는 영역보다 약간 큰 것을 알 수 있죠. 그래서 마찬가지로 해당 앱에서도 뷰를 일정한 비율인 1:1.5로 표시되도록 나타내주는 것이 필요했습니다.
이는 app:layout_constraintVertical_weight=”1″ 코드를 통한 수직 가중치 비율을 정해주는 것으로 설정할 수 있습니다. 테이블 레이아웃 위를 차지할 View를 하나 정의하고 그 가중치를 1로 줍니다. 이후 테이블 레이아웃에서는 가중치를 1.5로 설정합니다. 아래와 같이 뷰가 특정 비율로 잘 나눠지는 것을 확인할 수 있습니다.
2.2 버튼 둥글게 하고 ripple 효과 주기
다음은 계산기 버튼을 둥글게하고 ripple 애니메이션 효과를 주는 방법입니다. drawable xml파일을 2개 생성합니다. (각각 초록버튼 하얀버튼) 그리고 ripple 태그로 감싸고 아래와 같은 코드로 추가해주시면 되겠습니다.
이때 shape로 rectangle을 주어 사각형을 기반으로하고 radius를 100dp로 설정해서 가능한한 최대의 원형 값을 갖도록 해주면 알아서 동글동글한 버튼의 형태로 drawable 객체를 만들 수 있습니다.
그리고 메인 엑티비티로 xml 파일로 넘어가서 background로 방금 만들어주었던 drawable 객체를 설정해주시면 되겠습니다. 아래는 초록색 버튼 백그라운드로 설정하는 코드 예시입니다. 이처럼 모든 버튼에 각각 배경을 설정해주시면됩니다.
3. 계산 기록 레이아웃 구성
계산 기록 레이아웃은 메인 엑티비티에 ConstraintLayout을 추가해서 구성합니다. 구성 시 프리뷰에 계산기 버튼이 가려질 수 있는데 이는 코드상에서 히스토리 버튼을 누를 때 마다 해당 뷰를 띄워주고 가려주고 할 것이기 때문에 크게 신경쓰지 맙니다.
ConstraintLayout 내부에 닫기 버튼 – 스크롤 뷰 – 계산기록 삭제 버튼 순서대로 달아주도록 하겠습니다. 제약은 계산식과 결과창 아래로 뜨게 설정해줍니다.
스크롤 뷰를 조금 더 자세히 설명하자면, 레이아웃 제약으로 바닥은 [검색 기록 삭제] 버튼 바로 위 그리고 천장은 [닫기] 버튼 바로 아래로 설정해주도록 합니다.
내부에는 레이아웃이 필요하며 LinearLayout을 넣어 나중에 계산 기록을 여기에 LayoutInflater로 하나하나 수직으로 쌓아주도록 설정합니다. 이때 layout_height 속성의 경우에는 wrap_content가 권장됩니다. 그래야 스크롤 뷰를 사용하느 의미가 있겠죠.
3.1. LayoutInflater 로 계산기록 넣기
계산 기록은 사용자가 계산할 때마다 로컬 디비에 저장 한뒤 이를 히스토리 버튼을 누를 때 레이아웃 인플레이터로 즉각 생성해서 위에서 작성해준 스크롤뷰 내부의 리니어 레이아웃 안에 넣어줘서 유저가 확인할 수 있게 할겁니다.
그래서 먼저 계산 기록 레이아웃을 따로 만들어주도록 합니다. 아래와 같이 history_row.xml 을 따로 만든 후 제약 레이아웃에 텍스트 뷰 2개를 넣어서 계산 식과 계산 결과를 볼 수 있도록 정의해주었습니다.
이후에 사용자가 히스토리 버튼을 누르면 LayoutInflater로 우리가 작성해둔 히스토리 레이아웃은 history_row 를 불러와서 각각의 텍스트뷰에 계산식과 결과를 넣어서 히스토리 LinearLayout에 넣어주면 끝입니다.
// 디비에서 모든 기록 가져오기 // 뷰에 모든 기록 할당하기 Thread(Runnable { db.historyDao().getAll().reversed().forEach { // 뷰 생성하여 넣어주기 // 레이아웃 인플레이터 기능 사용 해보기 // ui 스레드 열기 runOnUiThread { // 핸들러에 포스팅될 내용 작성 // R.layout.history_row 에서 인플레이트를 시킴., root랑 attachToRoot. 나중에 addview를 통해 붙일거라 null, false val historyView = LayoutInflater.from(this).inflate(R.layout.history_row, null, false) historyView.findViewById
(R.id.expressionTextView).text = it.expression historyView.findViewById (R.id.resultTextView).text = “= ${it.result}” historyLinearLayout.addView(historyView) // 뷰 추가 } } // 리스트 뒤집어서 가져오기 }).start() 4. Room 활용한 로컬 DB 사용하기
Room 을 활용하면 SQLite를 좀더 쉽게 사용하면서 로컬디비를 구성할 수 있습니다. Room 을 사용해서 로컬 디비를 구성 및 사용하는 방법 및 타 스레드 사용 방법은 분량이 길어서 따로 작성해두었으니 이전 포스팅을 참고하시면 되겠습니다.
4.1. 확장 함수 사용하여 String isNumber 구현
확장 함수는 말 그대로 이미 정의된 클래스에 확장해서 우리가 필요한 기능을 넣어줄 때 사용할 수 있는 아주 유용한 기능으로 C# 등에도 있는 기능입니다. 여기서는 입력받은 숫자 문자열이 숫자로 변환이 가능하지 않다면 예외처리 시 false를 반환하면서 숫자가 아닌 것을 확인할 수 있도록 작성한 확장 함수를 추가해서 사용했습니다.
// 확장 함수 정의 fun String.isNumber(): Boolean { return try { this.toBigInteger() // 무한대 까지 저장 가능한 자료형 true } catch (e: NumberFormatException) { false } }
4.2. Kotlin Data Class
코틀린에서는 데이터 클래스라는 문법을 제공하는데 클래스 사용시 데이터를 보관할 목적으로 사용할 클래스라면 따로 toString(), hashCode(), equals(), copy() 매소드 및 getter, setter를 우리가 만들어줄 필요없이 자동으로 만들어주므로 편리하게 사용이 가능합니다.
데이터 클래스는 생성자로 1개 이상 프로퍼티가 선언되어야 하며, 생성자 프로퍼티는 val 또는 var로 선언해야합니다. 데이터 클래스에 abstract, open, sealed, inner를 붙일 수 없고 상속을 받을 수 없다는 특징이 있습니다.
package lilcode.aop.p2.c04.calculator.model import androidx.room.ColumnInfo import androidx.room.Entity // room 사용 import androidx.room.PrimaryKey // 데이터 클래스로 선언 @Entity(tableName = “history_table”) // room 사용(room의 데이터 클래스) db 테이블 data class History( @PrimaryKey val uid: Int?, // 유니크한 아이디 (기본키로 사용되는 듯) @ColumnInfo(name = “expression”) val expression: String?, @ColumnInfo(name = “result”) val result: String? )
안드로이드 스튜디오 초 간단 계산기 앱 만들기
안녕하세요 오늘은 초 간단 계산기 앱을 만들어 보겠습니다.
테이블 레이아웃을 이용하여 숫자 버튼을 만들어서 앱을 제작해 보겠습니다.
별 다른 코드 안 들어가고 아주 간단한 계산기 예제 이므로 쉽게 따라하실수 있습니다.
일단 프로젝트를 만들고 레이아웃을 꾸며 보겠습니다.
밑에는 xml 코딩입니다 레이아웃을 꾸미는 것이기 때문에 취향에 맞게
색상이나 이름을 바꾸셔도 상관없습니다. 저는 이렇게 꾸몄습니다
위에 코드를 다 넣으시면 이런 화면으로 레이아웃이 구성이 되었을 겁니다.
완성된 레이아웃
아주 심플하고 간단하네요 이제 자바 코드를 넣어보겠습니다
밑에는 자바 풀 소스입니다.
숫자 버튼을 제외한 activity_main.xml의 7개의 위젯에 대응할 위젯 변수 7개
입력될 2개 문자열을 저장할 문자열 변수 2개
계산 결과를 저장할 정수 변수 1개
10개 숫자 버튼을 저장할 버튼 배열
10개 버튼의 id를 저장할 정수형 배열
증가 값으로 사용할 정수 변수
package com.example.myapplication10; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends AppCompatActivity { EditText edit1, edit2; Button btnAdd, btnSub, btnMul, btnDiv; TextView textResult; String num1, num2; Integer result; Button[] numButtons = new Button[10]; Integer[] numBtnIDs = {R.id.BtnNum0, R.id.BtnNum1, R.id.BtnNum2, R.id.BtnNum3, R.id.BtnNum4, R.id.BtnNum5, R.id.BtnNum6, R.id.BtnNum7, R.id.BtnNum8, R.id.BtnNum9}; int i; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setTitle(“초간단 계산기”); edit1 = (EditText) findViewById(R.id.Edit1); edit2 = (EditText) findViewById(R.id.Edit2); btnAdd = (Button) findViewById(R.id.BtnAdd); btnSub = (Button) findViewById(R.id.BtnSub); btnMul = (Button) findViewById(R.id.BtnMul); btnDiv = (Button) findViewById(R.id.BtnDiv); textResult = (TextView) findViewById(R.id.TextResult); btnAdd.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View arg0, MotionEvent arg1){ num1 = edit1.getText().toString(); num2 = edit2.getText().toString(); result = Integer.parseInt(num1) + Integer.parseInt(num2); textResult.setText(“계산 결과 : “+ result.toString()); return false; } }); btnSub.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View arg0, MotionEvent arg1){ num1 = edit1.getText().toString(); num2 = edit2.getText().toString(); result = Integer.parseInt(num1) – Integer.parseInt(num2); textResult.setText(“계산 결과 : “+ result.toString()); return false; } }); btnMul.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View arg0, MotionEvent arg1){ num1 = edit1.getText().toString(); num2 = edit2.getText().toString(); result = Integer.parseInt(num1) * Integer.parseInt(num2); textResult.setText(“계산 결과 : “+ result.toString()); return false; } }); btnDiv.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View arg0, MotionEvent arg1){ num1 = edit1.getText().toString(); num2 = edit2.getText().toString(); result = Integer.parseInt(num1) / Integer.parseInt(num2); textResult.setText(“계산 결과 : “+ result.toString()); return false; } }); for (i = 0; i
간단한 계산기 앱 만들기(Android, 자료구조-후위표기식)(1)
이번에는 안드로이드 스튜디오를 이용해서 만든 간단한 계산기 앱을 보여드리려고 합니다.
원래 부스트코스 에이스 과정 중 기업연계 프로젝트로 진행한 주제였는데, ReactNative로 만들어야 하는 걸 제가 시간이 없는 관계로 이틀 동안 스튜디오로 만들었습니다. (하루 정도 코드를 rn으로 변환해보려고 했는데 쉽지가 않아서 포기했습니다. rn을 안드로이드 코드로 바꾸는 것보다 안드로이드 코드를 rn으로 바꾸는 게 더 어렵다는 자료를 본 거 같아요.)
먼저 완성된 것부터 보여드리고 코드로 넘어가겠습니다.
실행 예시
개요
더하기, 빼기, 곱하기, 나누기, 괄호 등으로 구성된 간단한 계산기 구현
구성
다른 앱과 기본 계산기 앱 등을 참고하여 사용자의 입력을 표기할 상단 레이아웃, 계산식에 필요한 20개의 버튼이 있는 하단 레이아웃으로 구성.
상단 레이아웃 : 사용자 입력을 표기할 텍스트뷰(+스크롤뷰) + 계산 결과 미리보기를 제공하는 텍스트뷰
하단 레이아웃 : 그리드 레이아웃과 거기에 속한 20개의 버튼
코드
MainAcitivity.java
package com.example.calculator;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
CalculateHelper calculateHelper;
boolean isDot;
boolean isBracket;
boolean isPreview;
TextView textView;
TextView textView2;
int size;
String result;
Button num0;
Button num1;
Button num2;
Button num3;
Button num4;
Button num5;
Button num6;
Button num7;
Button num8;
Button num9;
Button add;
Button sub;
Button mul;
Button div;
Button clear;
Button bracket;
Button percent;
Button back;
Button dot;
Button equal;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
calculateHelper = new CalculateHelper();
size = 0;
int number = 25;
int t = String.valueOf(Math.sqrt(number)).length();
Log.d(“test”, “” + t + ” ? ” + String.valueOf(Math.sqrt(number)));
isPreview = false;
isBracket = false;
isDot = false;
int[][] test = new int[5][4];
setButton();
setTextView();
}
private void setButton() {
num0 = findViewById(R.id.num0);
num1 = findViewById(R.id.num1);
num2 = findViewById(R.id.num2);
num3 = findViewById(R.id.num3);
num4 = findViewById(R.id.num4);
num5 = findViewById(R.id.num5);
num6 = findViewById(R.id.num6);
num7 = findViewById(R.id.num7);
num8 = findViewById(R.id.num8);
num9 = findViewById(R.id.num9);
add = findViewById(R.id.add);
sub = findViewById(R.id.sub);
mul = findViewById(R.id.mul);
div = findViewById(R.id.div);
clear = findViewById(R.id.clear);
bracket = findViewById(R.id.bracket);
percent = findViewById(R.id.percent);
back = findViewById(R.id.back);
dot = findViewById(R.id.dot);
equal = findViewById(R.id.equal);
num0.setOnClickListener(numClickListener);
num1.setOnClickListener(numClickListener);
num2.setOnClickListener(numClickListener);
num3.setOnClickListener(numClickListener);
num4.setOnClickListener(numClickListener);
num5.setOnClickListener(numClickListener);
num6.setOnClickListener(numClickListener);
num7.setOnClickListener(numClickListener);
num8.setOnClickListener(numClickListener);
num9.setOnClickListener(numClickListener);
add.setOnClickListener(markClickListener);
sub.setOnClickListener(markClickListener);
mul.setOnClickListener(markClickListener);
div.setOnClickListener(markClickListener);
clear.setOnClickListener(markClickListener);
bracket.setOnClickListener(markClickListener);
percent.setOnClickListener(markClickListener);
back.setOnClickListener(markClickListener);
dot.setOnClickListener(markClickListener);
equal.setOnClickListener(markClickListener);
}
//숫자 버튼이 눌렸을 경우
private Button.OnClickListener numClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.num0:
textView.append(“0”);
break;
case R.id.num1:
textView.append(“1”);
break;
case R.id.num2:
textView.append(“2”);
break;
case R.id.num3:
textView.append(“3”);
break;
case R.id.num4:
textView.append(“4”);
break;
case R.id.num5:
textView.append(“5”);
break;
case R.id.num6:
textView.append(“6”);
break;
case R.id.num7:
textView.append(“7”);
break;
case R.id.num8:
textView.append(“8”);
break;
case R.id.num9:
textView.append(“9″);
break;
}
preview();
}
};
//기호 버튼이 눌렸을 경우
private Button.OnClickListener markClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.add:
textView.append(” + “);
isPreview = true;
break;
case R.id.sub:
textView.append(” – “);
isPreview = true;
break;
case R.id.mul:
textView.append(” * “);
isPreview = true;
break;
case R.id.div:
textView.append(” / “);
isPreview = true;
break;
case R.id.percent:
textView.append(” % “);
isPreview = true;
break;
case R.id.clear:
textView.setText(“”);
textView2.setText(“”);
calculateHelper = new CalculateHelper();
isPreview = false;
break;
case R.id.bracket:
if (!isBracket) {
textView.append(“( “);
isBracket = true;
} else {
textView.append(” )”);
isBracket = false;
}
isPreview = true;
break;
case R.id.back:
size = textView.getText().length();
if (size != 0)
textView.setText(textView.getText().toString().substring(0, size – 1));
if (size > 1) {
if (calculateHelper.checkNumber(textView.getText().toString().substring(size – 2)))
preview();
else {
isPreview = false;
textView2.setText(“”);
}
}
break;
case R.id.dot:
textView.append(“.”);
isDot = true;
break;
case R.id.equal:
result = textView.getText().toString();
double r = calculateHelper.process(result);
if (!isDot)
textView.setText(String.valueOf((int) r));
else
textView.setText(String.valueOf(r));
textView2.setText(“”);
isDot = false;
isPreview = false;
break;
}
}
};
private void preview() {
if (isPreview) {
result = textView.getText().toString();
double r = calculateHelper.process(result);
if (!isDot)
textView2.setText(String.valueOf((int) r));
else
textView2.setText(String.valueOf(r));
}
}
private void setTextView() {
textView = findViewById(R.id.first_textView);
textView2 = findViewById(R.id.second_textView);
}
설명
버튼 클릭은 숫자, 기호로 구분되어 동작하며 버튼이 눌렸을 경우 append()를 사용하여 textView에 표시
textView2는 결과 미리보기로 1)숫자 입력 2)기호 입력 3)숫자 입력 순으로 앞에 숫자와 기호가 존재하고 다시 숫자가 입력되는 경우 미리보기를 제공한다. 계산은 CalculateHelper에서 진행 후 리턴.
CalculateHelper에 대한 것은 다음 글에서 설명하겠습니다.
[안드로이드 스튜디오] 기초 완전 간단한 계산기 앱 만들기!
감성 자동제어
[안드로이드 스튜디오] 간단한 계산기 앱 만들기!!안녕하세요 간단한 계산기 앱을 만드는 방법에 대해 알아보도록 하겠습니다! 먼저 구성에 대해 알아보도록 하겠습니다.
EditText 2개 = 값을 계산 할 숫자를 입력받습니다.
Button 4개 = 더하기, 빼기, 곱하기, 나누기 버튼입니다.
TextView 1개 = 결과값을 띄워서 확인합니다.
Activity_main.xml(layout)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 < ?xml version = "1.0" encoding = "utf-8" ? > < LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android" xmlns:app = "http://schemas.android.com/apk/res-auto" xmlns:tools = "http://schemas.android.com/tools" android:id = "@+id/layout" android:layout_width = "match_parent" android:layout_height = "match_parent" android:layout_margin = "10dp" android:orientation = "vertical" tools:context = ".MainActivity" > < LinearLayout android:layout_width = "match_parent" android:layout_height = "wrap_content" android:layout_weight = "0.2" android:gravity = "center" android:orientation = "vertical" > < EditText android:id = "@+id/Edit_1" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:hint = "첫 번째 숫자" android:textSize = "25dp" / > < EditText android:id = "@+id/Edit_2" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:hint = "두 번째 숫자" android:textSize = "25dp" / > < / LinearLayout > < LinearLayout android:layout_width = "match_parent" android:layout_height = "wrap_content" android:layout_weight = "1" android:orientation = "vertical" > < Button android:id = "@+id/btn_add" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:layout_weight = "1" android:text = "더하기" android:textSize = "25dp" / > < Button android:id = "@+id/btn_sub" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:layout_weight = "1" android:text = "빼기" android:textSize = "25dp" / > < Button android:id = "@+id/btn_mul" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:layout_weight = "1" android:text = "곱하기" android:textSize = "25dp" / > < Button android:id = "@+id/btn_div" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:layout_weight = "1" android:text = "나누기" android:textSize = "25dp" / > < / LinearLayout > < TextView android:id = "@+id/Text_result" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:text = "계산결과 : " android:textColor = "#171717" android:textSize = "40dp" / > < / LinearLayout > Colored by Color Scripter cs
MainActivity(Class)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 public class MainActivity extends AppCompatActivity { EditText edit1, edit2; Button btn_add, btn_sub, btn_mul, btn_div; TextView text_Result; String num1, num2; Integer result; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); edit1 = findViewById(R.id.Edit_1); edit2 = findViewById(R.id.Edit_2); btn_add = findViewById(R.id.Btn_add); btn_sub = findViewById(R.id.Btn_sub); btn_mul = findViewById(R.id.Btn_mul); btn_div = findViewById(R.id.Btn_div); text_Result = findViewById(R.id.Text_result); btn_add.setOnTouchListener( new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { num1 = edit1.getText(). toString (); num2 = edit2.getText(). toString (); result = Integer. parseInt (num1) + Integer. parseInt (num2); text_Result.setText( “계산결과 : ” + result. toString ()); return false ; } }); btn_sub.setOnTouchListener( new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { num1 = edit1.getText(). toString (); num2 = edit2.getText(). toString (); result = Integer. parseInt (num1) – Integer. parseInt (num2); text_Result.setText( “계산결과 : ” + result. toString ()); return false ; } }); btn_mul.setOnTouchListener( new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { num1 = edit1.getText(). toString (); num2 = edit2.getText(). toString (); result = Integer. parseInt (num1) * Integer. parseInt (num2); text_Result.setText( “계산결과 : ” + result. toString ()); return false ; } }); btn_div.setOnTouchListener( new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { num1 = edit1.getText(). toString (); num2 = edit2.getText(). toString (); result = Integer. parseInt (num1) / Integer. parseInt (num2); text_Result.setText( “계산결과 : ” + result. toString ()); return false ; } }); } } Colored by Color Scripter cs
결과화면
결과화면
마무리
이상으로 간단한 계산기를 만들어 보았습니다. 아마 소수점을 입력하거나 텍스트를 입력하고 버튼을
누르면 오류가 나며 앱이 종료가 되는 현상이 나타납니다. 이번글에는 간단한 사칙연산을 하기위한 방법에 대해 먼저 알아보기 위해 최대한 간단하게 작성하였습니다. 다음글에는 이것을 보완하여 업그레이드된 계산기를 만들어 보도록 하겠습니다. 감사합니다!!
긴 글 읽느라 수고하셨습니다. 오늘도 일상 속 소소한 행복을 느끼길 바랍니다! 더 많은 정보 ↓↓↓ https://engineering-mino.tistory.com/
생각저장소 (시니어 개발자가 사는 이야기)
반응형
자료출처 : stackoverflow.com/questions/26533347/format-currency-string-using-edittext-in-android
어느 분의 요청으로 앱에 숫자 입력을 마치 계산기 처럼 숫자를 입력하면 3자리 마다 콤마가 나오게 하는 방법을 찾아 보다가 위의 링크를 보게 되었다.
import android.text.Editable; import android.text.TextWatcher; import android.widget.EditText; import java.text.DecimalFormat; import java.text.ParseException; public class NumberTextWatcher implements TextWatcher { private DecimalFormat df; private DecimalFormat dfnd; private boolean hasFractionalPart; private EditText et; public NumberTextWatcher(EditText et) { df = new DecimalFormat(“#,###.##”); df.setDecimalSeparatorAlwaysShown(true); // 소숫점 이하를 표시할 까 ? dfnd = new DecimalFormat(“#,###”); this.et = et; hasFractionalPart = false; // 분수여부 ? } @SuppressWarnings(“unused”) private static final String TAG = “NumberTextWatcher”; public void afterTextChanged(Editable s) { et.removeTextChangedListener(this); try { int inilen, endlen; inilen = et.getText().length(); // 입력된 값에서 숫자만 추출 String v = s.toString().replace(String.valueOf(df.getDecimalFormatSymbols().getGroupingSeparator()), “”); Number n = df.parse(v); int cp = et.getSelectionStart(); // 소숫점 입력 여부에 따라서 if (hasFractionalPart) { et.setText(df.format(n)); } else { et.setText(dfnd.format(n)); } // 전체 입력된 길이를 기준으로 해서 endlen = et.getText().length(); int sel = (cp + (endlen – inilen)); // 한글짜씩 추가 하는 형식으로 처리 if (sel > 0 && sel <= et.getText().length()) { et.setSelection(sel); } else { // place cursor at the end? et.setSelection(et.getText().length() - 1); } } catch (NumberFormatException nfe) { // do nothing? } catch (ParseException e) { // do nothing? } et.addTextChangedListener(this); } public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void onTextChanged(CharSequence s, int start, int before, int count) { // 소숫점이 입력 되는 지를 체크 if (s.toString().contains(String.valueOf(df.getDecimalFormatSymbols().getDecimalSeparator()))) { hasFractionalPart = true; } else { hasFractionalPart = false; } } } 대강 필요한 부분의 기능을 살펴 보면 위에 소스에 달아 놓은 코멘트와 같지 않을 까 싶다. 그리고 layout 에서 주의할 것은 EditText 의 gravity 을 end 로 설정해서 입력하는 숫자가 오른쪽 끝에서 입력이 되도록 설정을 해야 내가 만든 앱에서 입력이 계산기 처럼 숫자가 입력될 때 표시가 되는 효과를 느낄 수 있다. 반응형
[iOS 어플 만들기] 계산기 만들기 도전 2일차(아이폰계산기 클론코딩)
오늘의 목표
레이아웃 최대한 비슷하게 만들기. 사칙연산 함수 구현하기 프린트되는 라벨이 이상하게 나오지 않게 연산이나 숫자 입력할 때 오류 없이 만들기.
레이아웃 비교
아이폰 계산기
내가 만든거
(이 정도면 비슷하지 않나..?)
사칙연산 함수 구현
이 부분에서 제일 고민을 많이 했다. 일단, 사칙연산 함수를 구현하기 전에 DisplayLabel 에서 숫자를 어떻게 표현할지 고민을 했다.
func changeNumber ( _ a : Int ) { load = false printnum = printnum * 10 + Double ( a ) displayLabel . text = String ( printnum ) if ! load { acButton . setTitle ( “C” , for : . normal ) } else { acButton . setTitle ( “AC” , for : . normal ) } }
나는 이런 방식을 사용하였다.
그리고 사칙연산은, 연산을 하려는 숫자 두 개와 사칙연산중 어떤 연산을 할지 알려주는 숫자 하나, 총 3개의 매개변수를 이용하는 함수를 만들었다.
func operation ( _ a : Double , _ b : Double , _ op : Int ) – > Double { switch op { case 1 : return ( a + b ) case 2 : return ( a – b ) case 3 : return ( a * b ) case 4 : return ( a / b ) case 5 : return a . truncatingRemainder ( dividingBy : b ) default : return 0 } }
다른 언어에서는 나머지 연산( % )이 사용가능했는데, 여기서는 오류가 떠서 구글링을 해보니 truncatingRamainder(dividingBy: ) 함수를 사용하라고 하더라.
프린트 관련
프린트는 좀 비효율적으로 만들었다. 처음에 큰 그림을 아예 생각하지 않고 코드를 짜다보니 뭔가 더티 코딩이 된 것 같은 느낌…그래서 프린트 문은 너무 많은 함수에 껴있기 때문에 따로 코드 첨부를 하지 않았다.
이제 또 목표는 출력이 9자리가 안넘어가게 하는 것과 쉼표 넣는 것 등이 있겠다.
이런거 한번 만들어보니 재밌구나!
클론코딩을 앞으로 많이 해봐야겠다.
키워드에 대한 정보 계산기 앱 만들기
다음은 Bing에서 계산기 앱 만들기 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.
이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!
사람들이 주제에 대해 자주 검색하는 키워드 앱인벤터 7강 계산기 앱 만들기
- 동영상
- 공유
- 카메라폰
- 동영상폰
- 무료
- 올리기
앱인벤터 #7강 #계산기 #앱 #만들기
YouTube에서 계산기 앱 만들기 주제의 다른 동영상 보기
주제에 대한 기사를 시청해 주셔서 감사합니다 앱인벤터 7강 계산기 앱 만들기 | 계산기 앱 만들기, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.